C阵列问题

时间:2011-05-25 07:24:13

标签: c arrays turbo-c

当一个简单的变量名用作传递给函数的参数时,该函数将获取与此变量名对应的,并将其作为新变量安装在由该变量创建的新内存位置中。为此目的的功能。但是当数组的地址作为参数传递给函数时会发生什么?该函数是否创建另一个数组并将值从调用程序中的数组移入其中?

7 个答案:

答案 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)

当您传递数组的地址时(我相信您正在讨论指针),指针的副本将传递给该函数。