Yun*_*mez 2 c string recursion pointers
我正在学习c编程中的字符串和字符。今天我看到了一个代码,它以相反的顺序打印字符串,但是我不明白它是如何工作的。您能帮我理解它吗?
void reverse(const char * const sPtr)
{
if ('\0' == sPtr[0]) {
return;
}
else {
reverse(&sPtr[1]);
putchar(sPtr[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白该功能如何反转字符串
该函数不反转字符串。其参数用qualifier声明const
。
void reverse(const char * const sPtr);
^^^^^
Run Code Online (Sandbox Code Playgroud)
它以相反的顺序输出字符串。
由于这些陈述
reverse(&sPtr[1]);
putchar(sPtr[0]);
Run Code Online (Sandbox Code Playgroud)
字符串的第一个字符最后输出,最后输出终止零之前的最后一个字符。
该函数可以编写得更简单,例如
void reverse( const char *s )
{
if ( *s )
{
reverse( s + 1 );
putchar( *s );
}
}
Run Code Online (Sandbox Code Playgroud)
假设它s
是一个指向字符串literal的第一个字符的指针"Hello"
。
然后,由于字符“ H”不等于0(if ( *s )
),因此函数调用自身,将指针传递给第二个字符,即to 'e'
。
同样,“ e”不等于0,因此该函数以递归方式调用自身。它将自行进行调用,直到if语句中的表达式if ( *s )
评估为false,然后*s
等于'\0'
。因此,该函数的先前调用会输出其相应的字符
putchar( *s );
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式想象
1 reverse( "Hello"[0] );
2 reverse( "ello"[0] );
3 reverse( "llo"[0] );
4 reverse( "lo"[0] );
5 reverse( "o"[0] );
6 reverse( ""[0] );
6 // do not call putchar
5 putchar( 'o' );
4 putchar( 'l' );
3 putchar( 'l' );
2 putchar( 'e' );
1 putchar( 'H' );
Run Code Online (Sandbox Code Playgroud)