将数组作为parameter passing给C中的函数
我写了一个包含数组作为参数的函数,并通过传递数组的值如下所示调用它。
void arraytest(int a[]) { // changed the array a a[0]=a[0]+a[1]; a[1]=a[0]-a[1]; a[0]=a[0]-a[1]; } void main() { int arr[]={1,2}; printf("%d \t %d",arr[0],arr[1]); arraytest(arr); printf("\n After calling fun arr contains: %d\t %d",arr[0],arr[1]); }
我发现虽然我通过传递值来调用arraytest()
函数,但是int arr[]
的原始副本已更改。
你能解释一下为什么?
当传递一个数组作为参数时,这个
void arraytest(int a[])
的意思完全一样
void arraytest(int *a)
所以你正在修改main的值。
由于历史的原因,数组不是一等公民,不能通过价值传递。
您没有将数组作为副本传递。 它只是一个指向第一个元素在内存中的地址的指针。
您正在传递数组的第一个元素的地址
在C语言中,除了一些特殊情况外,数组引用总是“衰减”到指向数组的第一个元素的指针。 因此,“按价值”传递数组是不可能的。 函数调用中的数组将作为指针传递给函数,类似于通过引用传递数组。
编辑:有三个这样的特殊情况下,数组不衰减到它的第一个元素的指针:
-
sizeof a
与sizeof (&a[0])
。 -
&a
与&(&a[0])
不相同&(&a[0])
不完全相同)。 -
char b[] = "foo"
与char b[] = &("foo")
。
您正在传递数组的第一个成员的内存位置的值。
因此,当您开始修改函数内部的数组时,您正在修改原始数组。
请记住, a[1]
是*(a+1)
。
如果你想在一个函数中传递一维数组作为参数 ,你必须用下面三种方法之一来声明一个forms参数,并且所有三种声明方法产生相似的结果,因为每一个都告诉编译器一个整型指针正在进行被接收 。
int func(int arr[], ...){ . . . } int func(int arr[SIZE], ...){ . . . } int func(int* arr, ...){ . . . }
所以,你正在修改原始值。
谢谢 !!!
C中的数组在大多数情况下被转换为指向数组第一个元素的指针。 而更详细的数组传递到函数总是转换成指针。
这里是K&R2nd的一句话 :
当一个数组名被传递给函数时,传递的是初始元素的位置。 在被调用函数中,这个参数是一个局部variables,所以一个数组名称参数是一个指针,也就是一个包含地址的variables。
写作:
void arraytest(int a[])
与写作有同样的意义:
void arraytest(int *a)
所以,尽pipe你没有明确地写它,但是你正在传递一个指针,所以你正在修改main中的值。
对于更多,我真的build议阅读这个 。
而且,你可以在这里find其他的答案