此函数如何以相反顺序打印字符串?

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)

Vla*_*cow 8

我不明白该功能如何反转字符串

该函数不反转字符串。其参数用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)