在C中通过引用传递数组

Cos*_*ero 18 c arrays reference function

我是C的新手,我有一个疑问.

由于C函数创建了它的参数的本地副本,我想知道为什么以下代码按预期工作:

void function(int array[]){

    array[0] = 4;
    array[1] = 5;
    array[2] = 6;   
}

int main(){

    int array[] = {1,2,3};

    function(array);

    printf("%d %d %d",array[0],array[1],array[2]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

线路输出为4 5 6.

为什么这样做有效而以下情况不然?

void function(int integer){

    integer = 2;
}

int main(){

    int integer = 1;

    function(integer);

    printf("%d",integer);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出仅为1.

简短版本:为什么函数可以修改父变量的值,如果它们作为数组传递?

谢谢你们!

kfs*_*one 20

这是因为数组倾向于衰减为指针.

int a[] = { 1, 2, 3 };
int* p = a; // valid: p is now the address of a[0]
a = p;  // NOT valid.

printf("a = %p\n", a);
printf("p = %p\n", p); // prints same address as a
Run Code Online (Sandbox Code Playgroud)

a并且p将打印相同的值.

相反的是其他人所说的,a不是一个指针,它可以简单地衰减到一个.http://c-faq.com/aryptr/aryptrequiv.html

在你的第一个function()传递的是数组的第一个元素的地址,并且函数体取消引用它.事实上,编译器正在将函数原型视为:

void function(int* array /*you wrote int array[]*/){
    array[0] = 4;
    array[1] = 5;
    array[2] = 6;   
}

function(&array[0]);
Run Code Online (Sandbox Code Playgroud)

这必须发生,因为你说"未知大小的数组"(int array []).编译器无法保证推导出值传递所需的堆栈量,因此它会衰减到指针.

----编辑----

让我们结合你的例子,并使用更多独特的名称,使事情更清晰.

#include <stdio.h>

void func1(int dynArray[]) {
    printf("func1: dynArray = %p, &dynArray[0] = %p, dynArray[0] = %d\n",
             dynArray, &dynArray[0], dynArray[0]);
}

void func2(int* intPtr) {
    printf("func2: intPtr = %p, &intPtr[0] = %p, intPtr[0] = %d\n",
             intPtr, &intPtr[0], intPtr[0]);
}

void func3(int intVal) {
    printf("func3: intVal = %d, &intValue = %p\n",
             intVal, &intVal);
}

int main() {
    int mainArray[3] = { 1, 2, 3 };
    int mainInt = 10;

    printf("mainArray = %p, &mainArray[0] = %p, mainArray[0] = %d\n",
             mainArray, &mainArray, mainArray[0]);
    func1(mainArray);
    func2(mainArray);

    printf("mainInt = %d, &mainInt = %p\n",
             mainInt, &mainInt);
    func3(mainInt);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在ideone上进行现场演示:http://ideone.com/P8C1f4

mainArray = 0xbf806ad4, &mainArray[0] = 0xbf806ad4, mainArray[0] = 1
func1: dynArray = 0xbf806ad4, &dynArray[0] = 0xbf806ad4, dynArray[0] = 1
func2: intPtr = 0xbf806ad4, &intPtr[0] = 0xbf806ad4, intPtr[0] = 1

mainInt = 10, &mainInt = 0xbf806acc
func3: intVal = 10, &intValue = 0xbf806ad0
Run Code Online (Sandbox Code Playgroud)

func1func2"dynArray"和"intPtr"是局部变量,但它们是指针变量,它们从main接收"mainArray"的地址.

此行为特定于数组.如果要将数组放在结构中,那么您可以按值传递它.