C语言 向下传递包含数组的结构,为什么数组名称的值会改变?

  • 本文关键字:数组 改变 结构 语言 包含 arrays c
  • 更新时间 :
  • 英文 :


假设我有一个结构:

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);格式化。

最新更新