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 ( 0
najczęstszym przykładem jest prosty ), albo takim wyrażeniem przypisanym do void*
(takim jak (void*)0
).
NULL
to 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 0
lub ((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
, 0
lub (void*)0
nadal 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.