当一个简单的变量名用作传递给函数的参数时,该函数将获取与该变量名对应的值并将其作为新变量安装在该函数为此目的创建的新内存位置中。但是当数组的地址作为参数传递给函数时会发生什么?该函数是否创建另一个数组并将值从调用程序的数组中移入其中?
7 回答
不,如果您将某物的地址传递给函数,则该函数会获取该地址。从技术上讲,它获取地址的副本(都是按值传递,我们只是使用指针来模拟按引用传递),因此,如果您在函数中更改该地址,则不会影响返回。
通过取消引用地址,您可以更改它指向的内容。例如:
void changeValA (int x) {
x = 42; // x is 42 but a is unchanged.
}
void changeValB (int *x) {
*x = 42; // *x (hence a) is now 42
}
:
int a = 31415; // a is 31415
changeValA (a); // a is still 31415
changeValB (&a); // a is now 42
传递数组的地址与传递数组本身几乎相同。在这种情况下,数组衰减到它的第一个元素的地址。
不。
当数组被传递给函数时,它会衰减为指向数组第一个元素的指针。这允许函数完全像原始代码一样访问数组元素,包括修改将指针传递给函数时附带的元素的能力,但失去了知道数组的编译时大小的能力sizeof
。
基本上,这是:
void func(int a[]);
// ...
int i[] = { 0, 1, 2, 3, 4 };
func(i);
正在有效地这样做:
void func(int *a);
// ...
int i[] = { 0, 1, 2, 3, 4 };
func( & (i[0]) );
请注意,接收数组的函数因此无法知道它有多长。这就是为什么几乎所有采用数组(或指针)的函数也采用大小参数的原因。
地址的数值会被复制到栈中,而不是地址指向的内存空间!
数组的名称可以被视为指向其起点的指针。因此,当您将数组传递给函数时,就好像您在传递一个指针。没有创建新数组。
不,只有数组的引用/地址会消失。因此,数组上函数内的任何更新都会影响传递的数组。
在 C 中,数组总是通过引用传递(即只传递指向其开头的指针)。
如果你真的想通过值传递一个数组,你可以将它包装在一个结构中,然后传递结构。没有其他方法可以按值传递数组。
不,当您传递数组的地址(我相信您在谈论指针)时,指针的副本将传递给函数。