我编写了一个包含数组作为参数的函数,并通过如下传递数组的值来调用它。
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)
所以您are修改main中的值。
由于历史原因,数组不是一等公民,不能按值传递。
您没有将数组作为副本传递。它只是指向第一个元素在内存中的地址的指针。
您正在传递数组第一个元素的地址
在C中,除少数特殊情况外,数组引用始终“衰减”到指向数组第一个元素的指针。因此,不可能“按值”传递数组。函数调用中的数组将作为指针传递给函数,类似于通过引用传递数组。
编辑:在三种特殊情况下,数组不会衰减到指向其第一个元素的指针:
sizeof a
与sizeof (&a[0])
不同。&a
与&(&a[0])
不同(并且与&a[0]
也不完全相同。]。char b[] = "foo"
与char b[] = &("foo")
不同。您正在传递数组第一个成员的内存位置的值。
因此,当您开始在函数内部修改数组时,您正在修改原始数组。
[请记住,a[1]
是*(a+1)
。
如果要将一维数组作为函数中的参数传递,则必须以以下三种方式之一声明一个形式参数,并且所有三种声明方法都会产生相似的结果,因为每个tells编译器将接收整数指针]]。
int func(int arr[], ...){ . . . } int func(int arr[SIZE], ...){ . . . } int func(int* arr, ...){ . . . }
因此,您正在修改原始值。
谢谢!!!
将多维数组作为参数传递给函数。
@@@@@@@@@@@@@@@@@@@@@@@@@。@@@@@@@@@@@@@@@@ [
================================================ =