Как должны быть записаны предварительные ANSI- C «0 указатели» в ANSI C? - PullRequest
0 голосов
/ 08 июля 2020

Я читаю старый код и нахожу такие структуры:

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

Ответы [ 2 ]

1 голос
/ 08 июля 2020

sp != (Symbol *)0 по-прежнему отлично действует в ANSI / ISO C. Любое целочисленное константное выражение со значением 0 может использоваться как константа нулевого указателя (C17 6.3.2.3 (3)) и может быть приведено к любому типу указателя, в результате чего будет получен нулевой указатель этого типа. Таким образом, это просто повторяет l oop до тех пор, пока sp не является нулевым указателем.

Было бы немного более привычно переписать его как sp != NULL, но это не обязательно. Если вы предпочитаете быть кратким, вы также можете просто написать

for(sp=symlist; sp; sp = sp->next)
1 голос
/ 08 июля 2020

Это просто способ указать типизированный нулевой указатель вместо более обычного NULL из stdlib.h, который имеет тип void *, никак не связанный с параметрами, указанными в K&R C.

...