Pointers 应如何进行ANSI-C前测试;“0指针”;是用ANSI C写的吗?

Pointers 应如何进行ANSI-C前测试;“0指针”;是用ANSI C写的吗?,pointers,c89,ansi-c,Pointers,C89,Ansi C,我正在阅读一些旧代码,我发现了如下结构: Symbol *lookup(s) char *s; { Symbol *sp; for(sp=symlist; sp!= (Symbol *)0; sp = sp->next) if(strcmp(sp->name, s) == 0) return sp; return 0; } 我理解ANSI C中的参数可以通过以下方式指定: Symbol *lookup(char

我正在阅读一些旧代码,我发现了如下结构:

Symbol *lookup(s)
    char *s;
{
    Symbol *sp;
    for(sp=symlist; sp!= (Symbol *)0; sp = sp->next)
        if(strcmp(sp->name, s) == 0)
            return sp;
    return 0;
}
我理解ANSI C中的参数可以通过以下方式指定:

Symbol *lookup(char *s) {
   ...
}
但我想知道如何处理0指针:

(Symbol *) 0

这只是一种指定类型化空指针的方法,而不是stdlib.h中具有void*类型的更常见的空指针,与K&R C中指定的方式参数毫无关系。

这只是一种指定类型化空指针的方法,而不是stdlib.h中具有void*类型的更常见的空指针,与K&R C中指定的方式参数完全不相关。

sp!=(Symbol*)0
在ANSI/ISO C中仍然完全有效。任何值为0的整型常量表达式都可以用作空指针常量(C17 6.3.2.3(3)),并且可以强制转换为任何指针类型,从而生成该类型的空指针。因此只要
sp
不是空指针,它就会重复循环

将其重写为
sp!=空,但不是必需的。如果你喜欢简洁,你也可以简单地写

for(sp=symlist; sp; sp = sp->next)
sp!=(Symbol*)0
在ANSI/ISO C中仍然完全有效。任何值为0的整型常量表达式都可以用作空指针常量(C17 6.3.2.3(3)),并且可以强制转换为任何指针类型,从而生成该类型的空指针。因此只要
sp
不是空指针,它就会重复循环

将其重写为
sp!=空,但不是必需的。如果你喜欢简洁,你也可以简单地写

for(sp=symlist; sp; sp = sp->next)