You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解C++通过指针算术实现字符串反转的函数逻辑

reverseString函数逻辑解析

首先附上格式化后的完整代码:

#include <iostream>
#include <cstring>

using namespace std;

char *reverseString(const char *str)
{
    int len = strlen(str); // 原字符串长度为10
    char *result = new char[len + 1]; // 动态申请11字节的内存,多1字节存结束符\0
    char *res = result + len; // 疑问1:是不是长度变成21?

    *res-- = '\0';  // 疑问2:是不是减去结束符?
    while (*str)
        *res-- = *str++;  // 疑问3:是不是交换字符?
    return result;  // 疑问4:为什么不返回res?
}

int main()
{
    const char* str = "Constantin";
    cout << reverseString(str) << endl;
}

疑问逐一解答

  • 关于char *res = result + len;
    这里是指针偏移运算,不是数值相加。result是新申请的字符数组的首地址,char类型占1字节,所以result + len就是指向数组中偏移10字节的位置,也就是新数组下标为10的最后一个元素,不是长度变成21。
  • 关于*res-- = '\0';
    后缀自减运算符优先级高于解引用运算符,执行逻辑为:先给res当前指向的数组最后一位赋值结束符\0,再将res指针向前偏移1位,指向数组下标为9的位置,不存在“减去结束符”的操作。
  • 关于*res-- = *str++;
    这不是交换操作,是正序读原字符串、倒序写新数组的操作:每次循环先读取str当前指向的原字符串字符,写入res当前指向的新数组位置,之后str向后偏移1位读取下一个原字符,res向前偏移1位准备写入下一个位置。例如原字符串第一个字符C会被写入新数组下标9的位置,第二个字符o写入下标8的位置,直到str遍历到原字符串的结束符\0时循环终止。
  • 关于为什么返回result不返回res
    循环结束后res已经偏移到了新数组首地址的前1位,属于无效地址。而result始终指向新申请的字符数组的首地址,C风格字符串的读取规则是从首地址开始向后遍历直到遇到\0,因此必须返回result。

补充注意点

该实现动态申请的堆内存没有自动释放,实际使用时需要在拿到返回的字符串指针、使用完毕后手动调用delete[]释放对应内存,否则会出现内存泄漏。

内容的提问来源于stack exchange,提问作者yurachika2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:54:05