std::reverse不能直接反转C风格数组,需传入首尾指针(尾后),且必须包含;长度计算用sizeof仅限数组作用域内;反转C字符串需排除'\0'。
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
C 风格数组长度不能靠运行时推导,常借助 sizeof(arr) / sizeof(arr[0]),但这只在数组作用域内有效(比如函数内部定义的数组),一旦传入函数就退化为指针,sizeof 结果变成指针大小(通常是 8),导致除零或越界。
示例:以下代码在函数内安全,但若把 arr 作为参数传进另一个函数,就不能再用 sizeof 算长度:
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
last 必须可解引用(即 last != first)或等于 first
arr - 1 是未定义行为,除非你明确分配了那块内存first ,避免空区间或反向传参(虽不会崩溃,但无效果)
对以 '\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,背后也藏着长度计算、指针有效性、空终止符处理三重陷阱。