这个C代码如何工作?

11 c recursion pointers

我正在查看以下代码,我使用递归在C中以相反的顺序打印字符串:

void ReversePrint(char *str) { //line 1
  if(*str) {                   //line 2
      ReversePrint(str+1);     //line 3
      putchar(*str);           //line 4
  }
}
Run Code Online (Sandbox Code Playgroud)

我对C相对较新,并且对第2行感到困惑.*str从我的理解是取消引用指针并应返回当前位置的字符串值.但是如何将它用作条件语句的参数(除了布尔权限?)?在第3行,指针将始终递增到下一个块(自int为4个字节)...因此,如果在字符串结束后的下一个内存块中发生数据,则此代码无法失败?

更新:所以c中没有布尔类型正确吗?如果值为0,则条件语句的计算结果为"false",否则为"true"?

Amb*_*ber 38

第2行检查当前字符是否为字符串的空终止符 - 由于C字符串以空值终止,并且空字符被视为false值,因此当它到达字符串末尾时它将开始展开递归(而不是尝试在空终止符后面的字符上调用StrReverse4,这将超出有效数据的范围).

另请注意,指针指向a char,因此递增指针仅增加1个字节(因为char是单字节类型).

例:

 0  1  2  3
+--+--+--+--+
|f |o |o |\0|
+--+--+--+--+
Run Code Online (Sandbox Code Playgroud)
  1. str= 0,然后*str'f'如此递归调用用于STR + 1 = 1制成.
  2. str= 1,然后*str'o'如此递归调用用于STR + 1 = 2制成.
  3. str= 2,然后*str'o'如此递归调用用于STR + 1 = 3制成.
  4. str= 3,则*stris '\0'\0false值因此if(*str)计算为false,因此不会进行递归调用,因此返回我们得到的递归...
  5. 最近的递归之后是`putchar('o'),之后,
  6. 接下来最近的递归之后是`putchar('o'),之后,
  7. 最近的递归之后是`putchar('f'),我们已经完成了.

  • 次要评论 - ASCII字符0通常被称为"nul"(带有一个l),而无效指针通常被称为"NULL"(带有两个l).我认为在这里做出区分非常重要,因为很容易迷失方向. (6认同)
  • 在C中,没有布尔类型,正确 - 相反,逻辑语句只是将评估为0的任何东西视为"false",将任何评估为非零的东西视为"true".由于"空字符"实际上只是一个值为0的字节,因此它被认为是"假". (5认同)
  • "nul"是一个简短的形式,是的,但是当谈到"null终结符"或"空字符"时,通常会使用正确的拼写(有两个l).例如:http://en.wikipedia.org/wiki/Null_character (4认同)
  • 我在维基百科上看不到任何东西,这表明这不仅仅是你自己的看法,希思. (3认同)