请知道这个反转函数是如何工作的,不是很明白,我知道指针确实指向字符串 [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
输出任何内容,指向每个字符(包括空终止符)的指针已按从前到后的顺序推送到调用堆栈。
现在,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/