数组当参数
约 10 分钟
把普通变量传给函数,函数拿到的是复制品,改了外面不变(前面讲过)。数组不一样:传数组时,传过去的不是整排盒子的复制,而是“这排盒子在哪”——也就是数组首元素的地址。
void fill(int a[], int n) {
for (int i = 0; i < n; i++) a[i] = i; // 直接改到原数组
}
int main() {
int b[5];
fill(b, 5);
cout << b[2]; // 输出 2,外面真的变了
}
所以函数里对数组元素的修改,外面看得见、留得住。原因是形参 int a[] 实际上等价于指针 int *a,它指向的就是原数组,a[i] 访问的和外面 b[i] 是同一格内存。
这跟普通变量的对比要记牢:
- 普通变量按值传递 → 传的是复制品 → 函数内改动不影响外面;
- 数组传的是地址 → 函数内改动会影响外面(相当于天然“引用”)。
由此带来一个好处和一个坑:
- 好处:想让函数改造一个数组(排序、清零、填值),直接传进去改就行,不用返回。
- 坑:不小心在函数里改乱了数组,外面的数据也跟着乱,且不易察觉。只想读不想改时,可以写成
const int a[],让编译器帮你拦住误改。
小纸条
这一点和普通变量有什么不同?
登录 后可看答案