2011-05-25 75 views
1

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

回答

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 

传递一个阵列的地址是几乎相同传递数组本身。在这种情况下,阵列衰减到其第一个元素的地址。

+0

那就好了。我会停止输入我的答案;) – 2011-05-25 07:27:22

+0

@Demian布莱希特哦,我明白了。因此,不是传递数组中的值,而只传递数组的*地址*。 Ahmmm函数然后可以使用该地址访问*原始*数组? – aer 2011-05-25 07:30:46

+1

@aerohn:是的,这就是你如何在旧式C中进行传递引用。希望在下一个ISO标准中,我们将得到C++'void changeValC(int&x){x = 42; } ... changeValC(a);'参考类型和C中最新鲜的不友好的位之一将退役:-) – paxdiablo 2011-05-25 07:35:04

-1

当你传递一个数组的地址时(我相信你正在谈论指针),指针的副本被传递给函数。

0

地址的数值将被复制到堆栈中,而不是地址指向的内存空间!

0

数组的名称可以视为指向其开始的指针。所以当你将数组传递给一个函数时,就好像你正在传递一个指针。没有新的数组被创建。

0

编号 只有数组的引用/地址会去。 因此,数组中函数的任何更新都会影响传递的数组。

0

在C中,数组总是按引用传递(即只传递指向其开始的指针)。

如果你真的想按值传递一个数组,你可以把它包装在一个结构体中,并传递结构体。没有其他方法可以按值传递数组。

1

当一个阵列被传递到功能

号,它衰变的指针数组的第一元件。这允许函数像原始代码一样访问数组元素,包括修改传递指向函数的元素的能力,但失去了使用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])); 

注意函数接收数组有没有办法知道它是因为这个有多长的路。这就是为什么几乎所有采用数组(或指针)的函数都需要一个大小参数。