数组名传参本质是退化为指针,void func(int arr[]) 实际等价于 void func(int* arr),sizeof(arr) 返回指针大小而非数组大小,需额外传size参数。
数组名传参本质是退化为指针
在 C++ 中,void func(int arr[]) 看起来像传数组,实际编译器会把它重写成 void func(int* arr) —— 也就是只传首元素地址。这意味着函数内 sizeof(arr) 永远是 sizeof(int*)(通常 8 字节),不是原数组大小。你无法靠形参推导出数组长度,必须额外传一个 size 参数。
常见错误现象:for (int i = 0; i 在函数内部永远只循环 1 或 2 次(取决于指针大小和 int 大小),导致越界或漏处理。
- 适用场景:C 风格接口、性能敏感且长度已知的底层操作
- 注意:不能用
arr[5]访问时做边界检查,因为编译器不校验 - 若原数组是
const int a[10],建议声明为void func(const int* arr, size_t n),明确意图
用引用传参保留数组类型和大小信息
写成 void func(int (&arr)[10]) 就能真正“传数组”——形参是引用,绑定到实参数组,sizeof(arr) 返回 40(假设 int 是 4 字节),std::extent_v<decltype></decltype> 也能拿到 10。这是唯一能让函数感知原始维度的方式。
但问题也很直接:模板参数必须完全匹配。传 int a[10] 可以,传 int b[11] 或 std::vector<int></int> 就编译失败。
立即学习“C++免费学习笔记(深入)”;