c++ - 这段代码是如何工作的,反转字符串的真正简短方法,它有效,但我不知道如何

标签 c++ string pointers

请知道这个反转函数是如何工作的,不是很明白,我知道指针确实指向字符串 [0],但是这个函数是如何能够打印正确的字符来正确反转字符串的,这是怎么回事是存档吗?

#include <iostream>
using namespace std;

void reverse(char *s); //prototype
//-------------------------------------------------------------------       
int main ()
{
    char str[] = "begin_this is a test_last";    //cstring to be reverse

    reverse(str);    //recursive function

    cout << "\n";

    return 0;
}
//--------------------------------------------------------------------- 
void reverse(char *s)               
{                                   
    if(*s){                         
        reverse(s + 1);
    }else
        return;
    cout << *s;   //question how this print the string in reverse??????
}

最佳答案

您的 reverse() 函数实际上并没有反转内存中的字符串,它只是以相反的顺序输出字符串的字符(要实际反转内存中的字符串,请使用 STL 的 std::reverse() 算法).

现在,让我们看看逻辑。

main() 调用 reverse()。堆栈帧被压入调用堆栈,其中 s 指向第一个字符(str 衰减为指向第一个字符的指针)。

s 没有指向空终止符,因此 reverse() 调用自身,将新的堆栈帧压入调用堆栈,其中 s 包含指向第二个字符的指针。

s 没有指向空终止符,因此 reverse() 再次调用自身,将新的堆栈帧压入调用堆栈,其中 s 包含指向第三个字符的指针。

依此类推,直到 reverse() 运行堆栈帧,其中 s 指向空终止符。此时,尚未向 std::cout 输出任何内容,指向每个字符(包括空终止符)的指针已按从前到后的顺序推送到调用堆栈。

call stack

现在,reverse() 停止调用自身并退出,从调用堆栈中弹出当前堆栈帧(其中 s 指向空终止符)。

执行返回到 reverse() 的前一个调用点,其堆栈帧中有 s 指向最后一个字符。该字符输出到 std::cout,然后 reverse() 退出,从调用堆栈中弹出该堆栈帧。

执行返回到 reverse() 的前一个调用点,其栈帧有​​ s 指向倒数第二个字符。该字符输出到 std::cout,然后 reverse() 退出,从调用堆栈中弹出该堆栈帧。

执行返回到 reverse() 的前一个调用点,其栈帧有​​ s 指向倒数第 3 个字符。该字符输出到 std::cout,然后 reverse() 退出,从调用堆栈中弹出该堆栈帧。

以此类推,直到执行返回到main(),整个字符串已经倒序输出到std::cout

关于c++ - 这段代码是如何工作的,反转字符串的真正简短方法,它有效,但我不知道如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496716/

相关文章:

c++ - 如何在 C++ 中将 localtime_s 与指针一起使用

c# - 为什么 C# 和 C++ 使用 _<variableName> 编码约定?

c++ - X3 的可变因子重复指令的改进

c++ - 将无限无锁缓冲区折叠为循环缓冲区时避免冲突

arrays - 新人需要帮助获得正确的正则表达式

iphone - 将一个指针指向另一个指针 - 会发生什么?

c++ - 使用指针来使用具有多态性的函数时,指针必须是基类的吗?

c++ - 所有连续子数组优化的总和

javascript - 在 typescript 中声明具有最小/最大长度的字符串类型

java - 用java实现RSA算法