Punktem, że większość odpowiedzi tutaj nie odnosi się, przynajmniej nie wprost, jest to, że wskaźnik zerowy jest wartością, która istnieje podczas wykonywania, a stała zerowego wskaźnika jest konstrukcją składniową, która istnieje w kodzie źródłowym C.
Stała wskaźnika zerowego , jak słusznie stwierdza odpowiedź Karlsona, jest albo stałym wyrażeniem całkowitym o wartości 0 ( 0najczęstszym przykładem jest prosty ), albo takim wyrażeniem przypisanym do void*(takim jak (void*)0).
NULLto makro zdefiniowane w <stddef.h>kilku innych standardowych nagłówkach, które rozwija się do zdefiniowanej implementacji stałej wskaźnika zerowego . Rozbudowa jest zazwyczaj 0lub ((void*)0)(potrzebne jest zewnętrzne nawiasach spełniać inne zasady językowe).
Tak dosłowna 0, kiedy używany w kontekście, który wymaga wyrażenia typu wskaźnik, zawsze wynikiem jest null pointer, czyli unikalną wartość wskaźnika, który wskazuje na żaden obiekt. Że nie nie nic o reprezentacji implikuje wskaźnik NULL . Wskaźniki zerowe są bardzo często reprezentowane jako zero-bitowe, ale mogą być reprezentowane jako dowolne. Ale nawet jeśli wskaźnik zerowy jest reprezentowany jako 0xDEADBEEF, 0lub (void*)0nadal jest stałą wskaźnika zerowego .
To odpowiedź na pytanie o stackoverflow Obejmuje to dobrze.
To implikuje, między innymi, że memset()lub calloc(), który może ustawić region pamięci na zero-bitów, niekoniecznie ustawi wskaźniki w tym obszarze na wskaźniki zerowe. Prawdopodobnie zrobią to na większości implementacji, ale język tego nie gwarantuje.
Nie wiem, dlaczego ta kwestia nie jest uważane za duplikat tej jednej , albo jak to miejscowe tutaj.