我预期的结果是相同的。两个函数做同样的事情,但
为什么它们不同?
我认为它与指针有关。
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;
}
答案 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。