将数组作为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语言中,除了一些特殊情况外,数组引用总是“衰减”到指向数组的第一个元素的指针。 因此,“按价值”传递数组是不可能的。 函数调用中的数组将作为指针传递给函数,类似于通过引用传递数组。

编辑:有三个这样的特殊情况下,数组不衰减到它的第一个元素的指针:

  1. sizeof asizeof (&a[0])
  2. &a&(&a[0])不相同&(&a[0])不完全相同)。
  3. 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其他的答案