传const数组参数可防止意外修改,编译期拦截赋值错误;const int*无大小信息需额外传size,const int (&arr)[N]可获长度且支持模板推导;static const数组常驻ROM省RAM;const引用可绑定临时量,非const引用则不可。

传 const 数组参数能防止意外修改
函数内部若不需要改数组内容,却用非 const 指针或引用接收,就可能一不小心写错成 arr[i] = 0 这类赋值。加 const 后,编译器直接报错,比如:error: assignment of read-only location。这不是运行时检查,是编译期拦截,成本为零,效果立竿见影。
const int* 和 const int (&)[N] 的行为差异很关键
二者都防写,但语义和能力完全不同:
-
const int* arr:只告诉编译器“别让我改*arr”,不带大小信息,调用方必须额外传size,且无法做编译期校验 -
const int (&arr)[10]:绑定到具体大小的数组,sizeof(arr)/sizeof(arr[0])可得长度,模板推导template<size_t n> void f(const int (&arr)[N])</size_t>更可泛化支持任意尺寸 - 注意:
const int arr[]在参数里仍是const int*,不是引用——这是 C 风格衰减,const不改变衰减本质
嵌入式或裸机环境下,const 数组常驻 ROM 更省 RAM
当数组声明为 static const int table[] = {1, 2, 3}; 并传给 const int* ptr 参数时,GCC/Clang 通常将其放入 .rodata 段(ROM),避免拷贝进 RAM。若去掉 const,即使没改它,编译器也可能按“可能被写”处理,强制分配 RAM 空间。这对 STM32、nRF52 等资源受限平台影响明显。
容易忽略的兼容性陷阱:临时数组和字面量
函数接受 const int* 时,能直接传字符串字面量 "hello" 或临时数组 {1,2,3}(C++11 起);但若用 int (&)[N] 引用,则不能绑定到临时对象(除非是 const 引用)。所以写 const int (&arr)[N] 是安全的,而 int (&arr)[N] 会拒绝合法调用,比如 f({1,2,3}) 直接编译失败。
立即学习“C++免费学习笔记(深入)”;


















