因为数组传参后退化为指针,sizeof失效,仅在定义作用域内安全;正确用法是int arr[]={1,2,3}时计算长度,错误是在函数参数中使用sizeof;替代方案为显式传长或改用std::array/vector。

用 for 循环遍历 C++ 原生数组时,为什么 sizeof(arr)/sizeof(arr[0]) 有时算不对?
因为数组传参后退化为指针,sizeof 就失效了。只在定义数组的同一作用域内才安全。
- 正确场景:
int arr[] = {1, 2, 3};此时sizeof(arr)/sizeof(arr[0])返回 3 - 错误场景:
void f(int a[]) { /* sizeof(a) 是指针大小 */ }这里sizeof(a)通常是 4 或 8,不是数组长度 - 替代方案:显式传长度,或改用
std::array/std::vector
用 std::for_each 遍历时,lambda 捕获和参数类型怎么写才不报错?
常见错误是把引用符号写错位置,或忽略 const 修饰导致无法绑定临时对象。
- 遍历并修改元素:
std::for_each(arr.begin(), arr.end(), [](int& x) { x *= 2; }); - 只读访问(推荐):
std::for_each(arr.begin(), arr.end(), [](const int& x) { std::cout << x; }); - 捕获外部变量需明确:
int offset = 10; std::for_each(v.begin(), v.end(), [&offset](int& x) { x += offset; });
range-based for 循环中,&、&&、const & 的区别在哪?
选错引用类型会导致意外拷贝、编译失败或静默修改原数组。
-
for (int x : arr)→ 每次拷贝元素,浪费性能(尤其对大对象) -
for (int& x : arr)→ 可修改原数组,但不能用于std::vector<bool></bool>等 proxy 类型 -
for (const int& x : arr)→ 安全只读,兼容性最好,推荐作为默认写法 -
for (int&& x : arr)→ 几乎无实际用途,不要用
遍历 std::vector 时,用下标还是迭代器?
下标访问直观,但迭代器更通用、支持算法组合,且在某些容器(如 std::list)中是唯一选择。
立即学习“C++免费学习笔记(深入)”;
- 下标适用:
for (size_t i = 0; i < v.size(); ++i) { std::cout << v[i]; }注意size()返回size_t,别和int混用 - 迭代器适用:
for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it; }更泛化,可无缝切换到其他容器 - 现代写法:
for (const auto& x : v)
简洁、安全、高效,覆盖绝大多数情况
实际写代码时,优先用 range-based for;需要索引才考虑下标;要配合 std::algorithm 才显式用迭代器。别在函数参数里传原生数组,除非你清楚自己在做什么。


















