std::reverse不能直接反转C风格数组,需传入首尾指针(尾后),且必须包含;长度计算用sizeof仅限数组作用域内;反转C字符串需排除'\0'。

reverse 函数不能直接反转 C 风格数组
std::reverse 接收的是两个迭代器(或指针),不是数组本身。C 风格数组名在多数上下文中会退化为指向首元素的指针,丢失长度信息,所以必须手动传入起始和结束地址。
常见错误是写成 std::reverse(arr) 或 std::reverse(arr, arr + n) 却没包含头文件或搞错结束位置——std::reverse 的第二个参数是「尾后指针」(one-past-the-end),不是最后一个元素的地址。
- 必须
#include - 起始用
arr或&arr[0],结束用arr + n(n是元素个数) - 对
int arr[5],合法调用是std::reverse(arr, arr + 5),不是arr + 4
用 sizeof 计算 C 数组长度要小心类型匹配
C 风格数组长度不能靠运行时推导,常借助 sizeof(arr) / sizeof(arr[0]),但这只在数组作用域内有效(比如函数内部定义的数组),一旦传入函数就退化为指针,sizeof 结果变成指针大小(通常是 8),导致除零或越界。
示例:以下代码在函数内安全,但若把 arr 作为参数传进另一个函数,就不能再用 sizeof 算长度:
立即学习“C++免费学习笔记(深入)”;
int arr[] = {1, 2, 3, 4, 5};
std::reverse(arr, arr + sizeof(arr) / sizeof(arr[0])); // ✅ 正确- 确保
arr是真正的数组(非指针),且未发生数组退化 -
sizeof(arr[0])比sizeof(int)更健壮,适配不同元素类型 - 如果已知类型,也可用
std::size(arr)(C++17 起),但注意它同样不适用于函数参数中的数组
反转部分子数组或带偏移的区间
std::reverse 的灵活性在于它操作任意连续区间,不只是整个数组。你可以轻松反转中间一段、前缀或后缀。
比如反转下标 1 到 3(含)的三个元素:arr[1], arr[2], arr[3],对应指针范围是 &arr[1] 到 &arr[4](尾后):
std::reverse(&arr[1], &arr[4]); // 反转索引 1~3
- 左闭右开区间:[first, last),
last必须可解引用(即last != first)或等于first - 支持负偏移?不行——C 风格指针运算依赖有效内存布局,
arr - 1是未定义行为,除非你明确分配了那块内存 - 反转前先检查
first ,避免空区间或反向传参(虽不会崩溃,但无效果)
reverse 对 char 数组(字符串)的特殊注意事项
对以 '\0' 结尾的 char 数组(C 字符串),直接 std::reverse 会把 '\0' 移到开头,后续 printf 或 strlen 就认为字符串为空——这不是 reverse 的问题,而是语义冲突。
如果你真要反转可见字符部分,得排除终止符:
char str[] = "hello"; std::reverse(str, str + std::strlen(str)); // 只反转 "hello",保留 '\0' 在末尾
- 别用
sizeof(str)——它包含'\0',反转后'\0'跑到开头,字符串变空 - 对宽字符
wchar_t数组,用std::wcslen替代std::strlen - 若只是想打印反转效果,建议转成
std::string处理,更安全
C 风格数组没有元信息,所有边界都靠程序员自己守。哪怕一行 std::reverse,背后也藏着长度计算、指针有效性、空终止符处理三重陷阱。










