为什么这两个函数的结果不同?

时间:2018-12-04 18:10:43

标签: c arrays function

我预期的结果是相同的。两个函数做同样的事情,但
为什么它们不同?
我认为它与指针有关。

void changer(int n){
    n = 20;
}

void arrayChanger(int n[]){
    n[0] = 20;
}

int main()
{
    int a = 5;
    int ar[1] = {5};

    changer(a);
    arrayChanger(ar);

    printf("%d\n",a);
    printf("%d\n",ar[0]);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

除非特别声明将参数声明为通过引用传递,否则

参数将通过值传递 ,并且数组在传递给函数时将衰减为指向其第一个元素的指针。

函数changer不会更新实际变量a,因为它仅接收其值,而不是变量本身。

如果要在函数调用中更新值,则需要通过引用传递该值:

void make20(int *a) 
{
    *a = 20;
}

呼叫将如下所示:

int n = 5;
make20(&n);
// now n = 20

答案 1 :(得分:2)

changer(a)中,您传递一个int作为参数。此int按值传递。这意味着执行changer时,它只接收int 5作为参数并将该参数设置为20。但是,由于该参数是通过值传递的,因此该函数外部的参数没有任何变化。 / p>

arrayChanger(ar)中,您传递一个数组作为参数。如Osiris所述,将数组传递给函数时,它“衰减”到指向该数组第一个元素的指针。因此,在arrayChanger中,将指针处的值设置为20。这意味着执行后,指针处的值(保持不变)现在为20,而不是原来的5。