数组当参数

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[],让编译器帮你拦住误改。
小纸条

这一点和普通变量有什么不同?

登录 后可看答案

数组当参数 · 考级冲刺 · op599 课程