`if(!* str)...`对于`char * str`意味着什么?

时间:2015-11-16 07:29:34

标签: c

!*s在此功能中做了什么:

void f( char *s) {
    if( !*s ) {
        return;
    }
    f( s+1 );
    putchar( *s );
}

int main( void ) {
    f("kernighan");
    putchar('\n');
return 0;
}

该程序的输出为nahginrek;我觉得它换了 左边的角色有正确的角色并一直这样做直到它到达中间?

4 个答案:

答案 0 :(得分:5)

它检查s指向的字符是否为ascii null(NUL)' \ 0'这是C字符串中的字符串分隔符(最后一个字符)。

如果!*s*s

'\0'将为真。

请注意,它与检查s是否为NULL不同,这意味着指针s指向零地址。

答案 1 :(得分:3)

正如其他人已经提到的那样,

 if( !*s )

相当于

if( !(*s) )

 if( *s == 0 )

添加一些引用,引用C11,章节§6.5.3.3,一元算术运算符,第5段,

  

[...]表达式!E相当于(0==E)

整个块

if( !*s ) {
    return;
}
如果你已经到达字符串的空终止符(which has a value 0),

确保函数返回。

答案 2 :(得分:1)

它测试s指向的字符是否为空(ascii字符\0)。 \0字符标记C样式字符串的结尾,因此测试基本上是检查递归是否已到达字符串的末尾。

在取消引用指针!后,将评估逻辑非*s。这不是对指针本身有效性的测试,看起来更像if (!s)if (s)

答案 3 :(得分:1)

s是一个指针。

*s取消了一个指针,该指针给出了存储在指针指向的位置的值。

!*s表示获取指针指向的值,并检查获取的值是否为\0