C++ 怎么反转数组 C++ reverse函数操作C风格数组【库使用】

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 + nn 是元素个数)
  • int arr[5],合法调用是 std::reverse(arr, arr + 5),不是 arr + 4

用 sizeof 计算 C 数组长度要小心类型匹配

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
  • 左闭右开区间:[first, last),last 必须可解引用(即 last != first)或等于 first
  • 支持负偏移?不行——C 风格指针运算依赖有效内存布局,arr - 1 是未定义行为,除非你明确分配了

    那块内存
  • 反转前先检查 first ,避免空区间或反向传参(虽不会崩溃,但无效果)

reverse 对 char 数组(字符串)的特殊注意事项

对以 '\0' 结尾的 char 数组(C 字符串),直接 std::reverse 会把 '\0' 移到开头,后续 printfstrlen 就认为字符串为空——这不是 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,背后也藏着长度计算、指针有效性、空终止符处理三重陷阱。