为何C++中void函数修改数组会影响外部,修改int变量却不会?
问题原因分析:值传递 vs 数组退化为指针
你看到的结果是C++中两种参数传递机制的差异导致的:
1. 为什么myFunction2没修改main里的变量c?
当你调用myFunction2(c)时,参数采用的是值传递:函数会创建参数a的副本,把c的值(也就是2)复制给这个副本。函数里执行的a = a+2,只是修改了这个副本的值,完全不会影响main函数里的原变量c。所以函数执行完,c还是原来的2。
2. 为什么myFunction能修改数组的首元素?
C++里数组作为函数参数时,会自动退化为指向数组首元素的指针。也就是说,你写的void myFunction(int a[],int b)本质上等价于void myFunction(int* a,int b)。
当你传入myArray时,传递的是数组首元素的内存地址。函数里的a[0] = 100;其实是通过指针直接操作原数组所在内存里的元素,所以main函数里的myArray[0]会被直接修改成100,而不是保持原来的7。
如何让myFunction2修改原变量?
如果想让函数能修改main里的c,可以用引用传递或者指针传递:
引用传递方式:
void myFunction2(int& a) { a = a + 2; }
调用时直接传c即可,函数会直接操作原变量。
指针传递方式:
void myFunction2(int* a) { *a = *a + 2; }
调用时需要传变量的地址:myFunction2(&c);
内容的提问来源于stack exchange,提问作者Omid Abasi
相关产品推荐
相关产品推荐

