将数组作为参数传递给C中的函数

问题描述 投票:73回答:9

我编写了一个包含数组作为参数的函数,并通过如下传递数组的值来调用它。

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[]的原始副本已更改。

你能解释为什么吗?

c arrays function parameters parameter-passing
9个回答
116
投票

[将数组作为参数传递时,此

void arraytest(int a[])

与……完全相同

void arraytest(int *a)

所以您are修改main中的值。

由于历史原因,数组不是一等公民,不能按值传递。


8
投票

您没有将数组作为副本传递。它只是指向第一个元素在内存中的地址的指针。


7
投票

您正在传递数组第一个元素的地址


6
投票

在C中,除少数特殊情况外,数组引用始终“衰减”到指向数组第一个元素的指针。因此,不可能“按值”传递数组。函数调用中的数组将作为指针传递给函数,类似于通过引用传递数组。

编辑:在三种特殊情况下,数组不会衰减到指向其第一个元素的指针:

  1. [sizeof asizeof (&a[0])不同。
  2. [&a&(&a[0])不同(并且与&a[0]也不完全相同。]。
  3. [char b[] = "foo"char b[] = &("foo")不同。

6
投票

在大多数情况下,C中的数组会转换为指向数组本身第一个元素的指针。传递给函数的更多详细信息始终会转换为指针。

这里是K&R2nd的引文:

当将数组名称传递给函数时,传递的是初始元素的位置。在调用的函数中,此参数是局部变量,因此数组名称参数是指针,即包含地址的变量。

写作:

void arraytest(int a[])

与写作具有相同的含义:

void arraytest(int *a)

因此,尽管您没有明确地编写它,但正如您传递指针一样,因此您正在修改main中的值。

更多,我真的建议您阅读this

此外,您可以在SO here上找到其他答案


5
投票

您正在传递数组第一个成员的内存位置的值。

因此,当您开始在函数内部修改数组时,您正在修改原始数组。

[请记住,a[1]*(a+1)


5
投票

如果要将一维数组作为函数中的参数传递,则必须以以下三种方式之一声明一个形式参数,并且所有三种声明方法都会产生相似的结果,因为每个tells编译器将接收整数指针]]。

int func(int arr[], ...){
    .
    .
    .
}

int func(int arr[SIZE], ...){
    .
    .
    .
}

int func(int* arr, ...){
    .
    .
    .
}

因此,您正在修改原始值。

谢谢!!!


4
投票

将多维数组作为参数传递给函数。


3
投票

@@@@@@@@@@@@@@@@@@@@@@@@@。@@@@@@@@@@@@@@@@ [

================================================ =

© www.soinside.com 2019 - 2024. All rights reserved.