使用指针算法反转字符串

Posted

技术标签:

【中文标题】使用指针算法反转字符串【英文标题】:Reverse string using pointer arithmetic 【发布时间】:2021-10-11 01:15:33 【问题描述】:

我试图了解以下函数 *reverseString(const char *str) 如何使用指针算术反转字符串。我一直在谷歌搜索并观看处理类似案件的视频,但不幸的是他们没有帮助我。 你能帮我理解这个功能是如何工作的吗? 我正在使用带有 Visual Studio Community 2019 的 Windows 10 Pro(64 位)。提前感谢您一如既往的帮助。我很感激。

#include <iostream>
#include <cstring>

using namespace std;

char *reverseString(const char *str)

    int len = strlen(str); // length = 10
    char *result = new char[len + 1]; // dynamically allocate memory for char[len + 1] = 11
    char *res = result + len; // length of res = 11 + 10 = 21?

    *res-- = '\0';  // subtracting ending null character from *res ?
    while (*str)
        *res-- = *str++;  // swapping character?
    return result;  // why not res?


int main()

    const char* str = "Constantin";
    cout << reverseString(str) << endl;

【问题讨论】:

【参考方案1】:
    char *result = new char[len + 1];

这一行分配一个新字符串(另一个字符串的字符长度,加上一个用于终止的空值),并将其存储在result 中。注意result指向字符串的开头,不会被修改。


    char *res = result + len;

这一行使res 指向result 的末尾:res 是一个指针,它等于result 的地址,但len 后面有字符。


    *res-- = '\0';

这一行:

将终止NULL写入res,当前指向result的结尾,并且 递减res,使其现在指向结果的前一个字符
    while (*str)
        *res-- = *str++;  // swapping character?

这些行:

循环直到str指向NULL 将str指向的字符写入res指向的目标内存,并 res--:递减 res 以指向内存中的前一个位置,并且 str++:递增str 以指向str 的下一个字符
    return result;  // why not res?

返回结果是因为它指向新字符串的(开头)。

【讨论】:

非常感谢您的解释@uuser9596600!很清楚我缺少什么来理解这个功能。我需要了解指针的工作原理。

以上是关于使用指针算法反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

前端与算法 leetcode 344. 反转字符串

LeetCode344 反转字符串

如何反转字符串数组并使用指针反转每个字符串?

算法千题案例每日LeetCode打卡——66.反转字符串

使用指针反转 char 字符串

算法千题案例每日LeetCode打卡——68.反转字符串中的元音字母