我正在查看以下代码,我使用递归在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)
str= 0,然后*str被'f'如此递归调用用于STR + 1 = 1制成.str= 1,然后*str被'o'如此递归调用用于STR + 1 = 2制成.str= 2,然后*str被'o'如此递归调用用于STR + 1 = 3制成.str= 3,则*stris '\0'和\0false值因此if(*str)计算为false,因此不会进行递归调用,因此返回我们得到的递归...