See the C-faq question 5.4
Como una cuestión de estilo, muchos programadores prefieren no tener sin adornos dispersos a través de sus programas, algunos números que representan de 0 y algunos indicadores que representan. Por lo tanto, el preprocesador macro NULL está definido (por varios encabezados, incluyendo y) como una constante de puntero nulo, generalmente 0 o ((void *) 0) (ver también la pregunta 5.6). Un programador que desee hacer explícita la distinción entre 0 el entero y 0 la constante del puntero nulo puede usar NULL siempre que se requiera un puntero nulo.
Usar NULL es solo una convención estilística; el preprocesador vuelve NULL a 0, que el compilador reconoce en contextos de puntero, como antes. En particular, aún se puede necesitar un lanzamiento antes de NULL (como antes de 0) en un argumento de llamada de función. La tabla de la pregunta 5.2 anterior se aplica para NULL así como para 0 (un NULL sin adornos es equivalente a 0 sin adornos).
NULL debe usarse solo como una constante de puntero; ver la pregunta 5.9.
References: K&R1 Sec. 5.4 pp. 97-8
K&R2 Sec. 5.4 p. 102
ISO Sec. 7.1.6, Sec. 6.2.2.3
Rationale Sec. 4.1.5
H&S Sec. 5.3.2 p. 122, Sec. 11.1 p. 292
What is this infamous null pointer anyways?
La definición del lenguaje establece que para cada tipo de puntero, hay un valor especial - el "puntero nulo" - que se distingue de todos los demás valores de puntero y que está "garantizado para compare desigual a un puntero a cualquier objeto o función ". Es decir, un puntero nulo apunta definitivamente a ninguna parte; no es la dirección de ningún objeto o función. El operador de dirección & nunca arrojará un puntero nulo, ni una llamada exitosa a malloc. [Nota al pie] (malloc devuelve un puntero nulo cuando falla, y este es un uso típico de punteros nulos: como un "especial" valor del puntero con algún otro significado, generalmente "no asignado" o "sin apuntar a ningún lado todavía")
Un puntero nulo es conceptualmente diferente de un puntero no inicializado. Se sabe que un puntero nulo no apunta a ningún objeto o función; un puntero no inicializado podría apuntar a cualquier parte. Ver también las preguntas 1.30, 7.1 y 7.31.
Como se mencionó anteriormente, hay un puntero nulo para cada tipo de puntero, y los valores internos de punteros nulos para diferentes tipos pueden ser diferentes. Aunque los programadores no necesitan conocer los valores internos, siempre se debe informar al compilador qué tipo de puntero nulo se requiere, de modo que pueda hacer la distinción si es necesario (ver preguntas 5.2, 5.5 y 5.6).
References: K&R1 Sec. 5.4 pp. 97-8
K&R2 Sec. 5.4 p. 102
ISO Sec. 6.2.2.3
Rationale Sec. 3.2.2.3
H&S Sec. 5.3.2 pp. 121-3
Por último, sólo constantes expresiones integrales con valor 0 están garantizados para indicar punteros nulos.
"Ahora asignar la constante 0 a un puntero colocará algún valor de puntero nulo específico de la plataforma en ese puntero." Esto es nuevo para mi; es realmente cierto? ¿Cuál es la plataforma/compilador más comúnmente utilizado donde esto es cierto, es decir, donde 'void * x = 0;' escribe un valor físico distinto de 0 en 'x'. –
@David Grayson: Bueno, primero, esto es realmente cierto, sí. En el nivel de lenguaje abstracto, por supuesto. En segundo lugar, la mayoría (todas) de las plataformas populares de hoy usan la dirección 0x0 como valor de puntero nulo, por lo que de hecho verá 0 en su puntero.Conceptualmente, sin embargo, no es la misma integral 0 que le asignó :) En tercer lugar, C FAQ (http://c-faq.com/null/machexamp.html) tiene algunos ejemplos de plataformas [exóticas] con un valor no nulo punteros nulos. En cuarto lugar, no hay nada que evite que uno tome las fuentes de GCC y las modifique para usar un valor físico distinto de cero para los null-punteros (si uno no tiene nada mejor que hacer). – AnT
¡Gracias por el enlace a las preguntas frecuentes de mi pregunta! Parece que todas las máquinas mencionadas son realmente viejas. No voy a perder el sueño por usar un 0 en un lugar donde NULL sería suficiente, pero puedo entender por qué los puristas se estremecerían. –