最常用且最安全的方式是使用带索引的普通for循环:int arr[5]; for(int i = 0; i
用
for循环给 C++ 原生数组赋值,最常用也最安全的方式是带索引的普通for原生数组(比如
int arr[5];)不提供迭代器或范围访问接口,所以不能直接用基于范围的for赋值——它只能读,不能写入(除非用引用,但容易出错)。推荐老老实实用索引循环:
- 明确控制起止位置,不易越界
- 支持任意赋值逻辑(如
i * 2、查表、调用函数)- 兼容所有 C++ 标准(C++98 起就可用)
示例:
int arr[5]; for (int i = 0; i <p>注意:必须用 <code>sizeof(arr)/sizeof(arr[0])</code> 计算长度(若在定义作用域内),硬写数字 5 容易和实际大小脱节。</p><h3>想用基于范围的 <code>for</code> 赋值?必须加 <code>&</code> 引用,否则只是改副本</h3><p>下面这段代码看似简洁,但完全无效:</p><pre class="brush:php;toolbar:false;">int arr[3] = {0}; for (int x : arr) { // x 是 int 的拷贝 x = 99; // 只改了 x,没动 arr[i] } // arr 仍是 {0, 0, 0}要真正写入,得声明为引用:
int arr[3] = {0}; for (int& x : arr) { // 注意 & 符号 x = 99; } // arr 变成 {99, 99, 99}但要注意:这种写法无法实现“按位置计算赋值”(比如第 i 个元素设为
i*i),因为循环体里拿不到索引i。适合统一初始化或从外部容器逐个搬运值。用
std::array替代原生数组,能兼顾安全与现代语法
std::array是原生数组的封装,有.size()、支持基于范围的for,还能传值/传引用,避免裸指针风险:
- 获取长度不用
sizeof,直接arr.size()- 可安全返回局部
std::array,原生数组不行- 配合
std::fill或std::iota能更简洁地批量赋值示例:
#include <array> #include <iota><p>std::array<int> arr; std::iota(arr.begin(), arr.end(), 10); // 从 10 开始递增填:{10,11,12,13} // 或手动循环: for (size_t i = 0; i (i) * 7; } </int></p></iota></array>常见错误:越界、类型不匹配、忘记初始化导致脏值
批量赋值时最容易栽在这几个地方:
- 循环条件写成
i 而不是 <code>i ,导致访问 <code>arr[N](越界,未定义行为)- 用
unsigned int做索引却写i >= 0作终止条件(无符号数永远 ≥ 0,死循环)- 数组未初始化就循环读取旧内存值,再拿它做计算依据(比如
arr[i] = arr[i-1] + 1,首项是垃圾值)- 混用
int和size_t比较(尤其在 64 位系统上可能触发编译警告或隐式截断)建议:定义数组后立刻用
{}初始化清零,循环变量统一用size_t或与.size()返回类型一致的类型。原生数组的边界和生命周期管理是隐式的,一旦离开定义作用域,
sizeof就失效;而std::array把尺寸绑在类型上,更可靠。真要写底层或嵌入式,裸数组绕不开,但日常开发优先考虑封装。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












