Un point que la plupart des réponses ici ne traitent pas, du moins pas explicitement, est qu'un pointeur nul est une valeur qui existe pendant l'exécution, et une constante de pointeur nul est une construction syntaxique qui existe dans le code source C.
Une constante de pointeur nul , comme l'indique correctement la réponse de Karlson, est soit une expression de constante entière avec la valeur 0 (un simple 0
est l'exemple le plus courant), soit une telle expression transtypée en void*
(telle que (void*)0
).
NULL
est une macro, définie dans <stddef.h>
et plusieurs autres en-têtes standard, qui se développe en une constante de pointeur nul définie par l'implémentation . L'expansion est généralement soit 0
ou ((void*)0)
(les parenthèses externes sont nécessaires pour satisfaire les autres règles de langage).
Ainsi, un littéral 0
, lorsqu'il est utilisé dans un contexte qui nécessite une expression de type pointeur, est toujours évalué à une null pointer
, c'est-à-dire une valeur de pointeur unique qui ne pointe vers aucun objet. Cela ne n'implique rien au sujet de la représentation d'un pointeur NULL . Les pointeurs nuls sont très souvent représentés sous forme de bits zéro, mais ils peuvent être représentés comme n'importe quoi. Mais même si un pointeur nul est représenté par , ou est toujours une constante de pointeur nul .0xDEADBEEF
0
(void*)0
Cette réponse à la question sur stackoverflow couvre bien cela.
Cela implique, entre autres, que memset()
ou calloc()
, qui peut définir une région de mémoire sur tous les bits à zéro, ne définira pas nécessairement les pointeurs de cette région sur des pointeurs nuls. Ils sont susceptibles de le faire sur la plupart des implémentations, mais le langage ne le garantit pas.
Je ne sais pas pourquoi cette question n'est pas considérée comme un double de celle-ci , ni comment elle est d'actualité ici.