C++中引用参数与数组传参的疑问解析
数组参数无需&就能修改元素的原因
你对引用参数的理解是对的:值传递时函数拿到的是变量副本,修改不会影响原变量;引用传递则直接操作原变量的内存,能修改目标参数。比如:
值传递代码:
void test(int x) { x++; } int main() { int number = 0; test(number); cout<<number; }
这段代码输出0,因为x是number的副本,修改x不影响原变量。
引用传递代码:
void test(int& x) { x++; } int main() { int number = 0; test(number); cout<<number; }
这段代码输出1,因为x是number的引用,直接操作原变量内存。
回到你的问题:这不是数组独有的特性,本质是数组作为函数参数时会被隐式转换成指向首元素的指针。
当你写void genericF(int aC[], int n, int& total)时,编译器会把int aC[]等价处理成int* aC——也就是说,你传递数组的时候,实际传递的是数组第一个元素的地址。函数内部通过aC[stoi(line)]++操作时,本质是通过指针访问原数组的内存空间,自然能修改原数组的元素。
这种设计是C++继承自C的特性,目的是避免拷贝整个大数组带来的性能浪费。但要注意,此时函数内部无法直接获取数组的完整长度,所以必须像你的代码一样额外传递长度参数n。
你的genericF代码:
void genericF(int aC[], int n, int& total) { fstream info; string line; info.open("sample.txt"); while (getline(info, line)) { if (stoi(line) < n) { total++; aC[stoi(line)]++; } } }
内容的提问来源于stack exchange,提问作者yungcoder
相关产品推荐
相关产品推荐

