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