**
C语言中函数参数传递的方式:值传递,地址传递
**
值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递
地址传递:使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,
即指向实参的存储单元,形参和实参占用相同的存储单元
引用传递:C++中
主要内容:
1> c语言中地址传递实参的方法
2> 多函数嵌套传递实参的方法,二维指针
3> 数组作为函数参数,而不改变数组的值,可以复制数组内容再进行修改
memcpy() 需要指定复制内容的长度,可以复制数组、结构体、类等
strcpy() 针对字符串,有'\0'结束标记
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// C语言中没有引用传递
void AddOwn(int *x)
{
*x = *x + 100;
}
void TransCapital_1(char *str)
{
int len = strlen(str); // strlen函数原型int strlen(char *);传入参数为地址,可计算传入数组的字符个数
printf("len = %d\n", len); // 输出为5,字符的个数
int size = sizeof(str); //sizeof
printf("size = %d\n", size); // 输出4,指针地址的大小
for (int i = 0; i < strlen(str); i++)
{
str[i] = str[i] - 32;
}
printf("TransCapital_1 = %s\n", str);
}
//函数参数为数组,但不改变函数外部数组的值,需要将数组内容复制一份
void TransCapital_2(char str[])
{
char str_[100];
//memcpy需要指定复制内容的长度,可以复制数组、结构体、类等
memcpy(str_, str, (strlen(str)+1)*sizeof(char)); //由于需要复制‘\0’所以需要在strlen后加1,避免str_乱码
int len = strlen(str_); // strlen函数原型int strlen(char *);传入参数为地址,可计算传入数组的字符个数,‘\0’结束
printf("len = %d\n", len); // 输出为5,字符的个数
int size = sizeof(str_); //sizeof计算内存空间
printf("size = %d\n", size); // 输出100
for (int i = 0; i < strlen(str_); i++)
{
str_[i] = str_[i] - 32;
}
printf("TransCapital_2 = %s\n", str_);
}
void swapRe(char **x, char **z) //二维指针,x、y为指针的地址
{
char *temp;
temp = *x;
*x = *z;
*z = temp;
}
void swap(char **x, char **y, char **z) //二维指针,x、y为指针的地址
{
int len = strlen(*x); // strlen函数原型int strlen(char *);传入参数为地址
printf("len = %d\n", len); // 输出为6,字符的个数
//交换x与y
char *temp;
temp = *x;
*x = *y;
*y = temp;
//交换y与z
swapRe(y, z); // 函数中的函数继续传递实参
printf("\n");
}
int main()
{
//简单的地址传递
int a = 1;
AddOwn(&a);
printf("a=%d\n", a);
printf("\n");
//数组如何作为实参传递,改变外部数组的值
char s[10] = {"hello"};
TransCapital_1(s); //数组名作为函数的参数,传递数组的地址,形参和实参共同占用一段内存
puts(s);
printf("\n");
//数组作为函数参数,但不改变外部数组的值
char s2[10] = { "hello" };
TransCapital_2(s2); //数组名作为函数的参数,传递数组的地址,形参和实参共同占用一段内存
puts(s2);
printf("\n");
char *ap = "AAAAAA";
char *bp = "BBBBBB";
char *cp = "CCCCCC";
swap(&ap, &bp, &cp); //传递指针地址,传实参
puts(ap);
puts(bp);
puts(cp);
system("pause");
}
//***********输出结果***************
a=101
len = 5
size = 4
TransCapital_1 = HELLO
HELLO
len = 5
size = 100
TransCapital_2 = HELLO
hello
len = 6
BBBBBB
CCCCCC
AAAAAA
请按任意键继续. . .