假设我有一个结构:
typedef struct{
int data[5];
}ArrayList;
主要功能为:
int main(int argc, char *argv[]) {
ArrayList test = {1,2,3,4,5};
int x;
change(test);
return 0;
}
change function body:
void change(ArrayList arr){
printf("%d",arr.data);
}
我的理解是,因为它是一个通过复制的传递,它传递了test的值,arr取这个值。
由于int data[5]是一个数组,它实际上不能一次传递它的所有实际成员,在本例中是整数,所以它给出了第一个成员的地址(test.data[0])。只能像data[0], data[1],…所以我假设arr。这里的数据值应该是test。数据(指指向第一个成员的指针,也就是地址)。
但是由于某种原因如果我输出arr的值。数据它显示的地址和test完全不同。当我打印arr的成员时,它包含test.data.
的所有成员。我将它看作类似的东西,如果我声明如下:
int data[5] = {1,2,3,4,5};
printf("%d", data);
change(data);
然后
void change(int data[]){
printf("%d", data); // this would have the same value as the statement above.
}
如何?测试得到它的值吗?
函数参数按值传递。函数形参是函数的局部变量,用相应实参的值初始化。
参数test
和参数arr
是不同的对象。它们在内存中不同的位置,其中的数组在内存中不同的位置,所以它们有不同的地址。
由于int data[5]是一个数组,它实际上不能一次传递它的所有实际成员,…
这是不对的。C语言没有提供任何通过数组的"值"(它是数组所有成员的"值"的总和)来复制数组的特性,但是你可以复制一个包含数组的结构体,并且它将复制所包含的数组。
顺便说一下,要正确打印地址,请将其转换为void *
并使用%p
:printf("%pn", (void *) arr.data);
格式化。