<p>最常用且最安全的方式是使用带索引的普通for循环:int arr[5]; for(int i = 0; i < 5; ++i) arr[i] = i * 2;</p>

用 for 循环给 C++ 原生数组赋值,最常用也最安全的方式是带索引的普通 for
原生数组(比如 int arr[5];)不提供迭代器或范围访问接口,所以不能直接用基于范围的 for 赋值——它只能读,不能写入(除非用引用,但容易出错)。推荐老老实实用索引循环:
- 明确控制起止位置,不易越界
- 支持任意赋值逻辑(如
i * 2、查表、调用函数) - 兼容所有 C++ 标准(C++98 起就可用)
示例:
int arr[5];
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10 + 1;
}
// 结果:arr = {1, 11, 21, 31, 41}
注意:必须用 sizeof(arr)/sizeof(arr[0]) 计算长度(若在定义作用域内),硬写数字 5 容易和实际大小脱节。
想用基于范围的 for 赋值?必须加 & 引用,否则只是改副本
下面这段代码看似简洁,但完全无效:
立即学习“C++免费学习笔记(深入)”;
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, 4> arr;
std::iota(arr.begin(), arr.end(), 10); // 从 10 开始递增填:{10,11,12,13}
// 或手动循环:
for (size_t i = 0; i < arr.size(); ++i) {
arr[i] = static_cast<int>(i) * 7;
}
常见错误:越界、类型不匹配、忘记初始化导致脏值
批量赋值时最容易栽在这几个地方:
- 循环条件写成
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 把尺寸绑在类型上,更可靠。真要写底层或嵌入式,裸数组绕不开,但日常开发优先考虑封装。


















