En C, ¿cuál es la diferencia entre un puntero NULL y un puntero que apunta a 0?En C, ¿hay alguna diferencia entre un puntero NULL y un puntero que apunta a 0? ¿Entonces qué?
Respuesta
La ISO/IEC 9899: estados TC2 en 6.3.2.3 Pointers
3 Un entero expresión constante con el valor 0, o un reparto tan expresión para escribir void *, que se llama un constant.55 puntero null) Si una constante puntero nulo se convierte en un tipo de puntero, el puntero resultante, llamado un puntero nulo, está garantizada para comparar desigual a un puntero a cualquier objeto o función
el NULL macro expande a una implementación definida constante de puntero nulo.
Cualquiera dos punteros nulos se compararán iguales.
Sí, sí. El estándar dicta que NULL
siempre apunta a la memoria no válida. Pero no indica que la representación entera del puntero deba ser 0. Nunca me encontré con una implementación para la cual NULL
fuera distinto de 0, pero eso no es un requisito del estándar.
Tenga en cuenta que la asignación del literal 0
a un puntero no significa que el puntero asume la representación entera de 0. Significa que el valor del puntero nulo especial se asigna a la variable del puntero.
La evaluación del literal 0
en un contexto de puntero es idéntica a NULL
. Cualquier patrón de bits que el compilador use para representar un puntero NULL
está oculto.
Las viejas preguntas frecuentes sobre comp.lang.c tienen una gran sección en el puntero nulo y vale la pena leerlas.
La idea es que un puntero NULL
debe de alguna manera representan un área de memoria que no es válido.
Así que en los segmentos de memoria inferiores se mapea el código del sistema operativo, se ha utilizado el valor 0 (para representar el puntero NULL) ya que esta área en la memoria no pertenece al programa del usuario sino que está asignada al código del sistema operativo.
- 1. ¿Diferencia entre puntero a puntero y puntero a matriz?
- 2. ¿Cómo puedo verificar si un puntero apunta a NULL?
- 3. ¿Cuál es la diferencia entre un puntero de vacío y un puntero NULL?
- 4. diferencia entre * (Índice + Puntero) y el puntero []
- 5. ¿Hay alguna diferencia entre utilizar este puntero y no usarlo?
- 6. Puntero que apunta a una matriz vacía
- 7. ¿Por qué 'fopen' devuelve un puntero NULL?
- 8. C++ borrar un puntero a un puntero
- 9. ¿Qué significa EXACTAMENTE "desreferenciando un puntero NULL"?
- 10. Puntero a un puntero en objetivo-c?
- 11. puntero a un puntero
- 12. en C++, ¿cuál es la diferencia entre un objeto y un puntero a un objeto?
- 13. ¿Hay alguna diferencia entre nulo y 0 al asignar punteros a un código inseguro?
- 14. Puntero de función que apunta a una función que toma un puntero de función
- 15. C++ de referencias entre un puntero a
- 16. ¿Hay alguna diferencia entre IS NULL y = NULL
- 17. ¿Lanzando NULL a un puntero de estructura en C?
- 18. ¿Cómo se elimina un puntero sin borrar los datos a los que apunta el puntero?
- 19. Diferencia entre const. puntero y referencia?
- 20. puntero constante frente a un puntero en un valor constante
- 21. ¿Por qué un puntero a un puntero es incompatible con un puntero a una matriz?
- 22. ¿Por qué tener un puntero a un puntero (int ** a)?
- 23. Referencia a un puntero
- 24. ¿Hay alguna diferencia entre i == 0 y 0 == i?
- 25. ¿Hay un puntero perezoso en C++?
- 26. diferencia entre (* ++ argv) [0] y mientras (c = * ++ argv [0])
- 27. C++ acceso const estático a través de un puntero NULL
- 28. Nullptr y comprobar si un puntero apunta a un objeto válido
- 29. ¿Cómo crear un puntero en C++ que apunta a una matriz multidimensional de int?
- 30. ¿Qué es un puntero Singleton en C?
relevante: http://c-faq.com/null/machexamp.html – nos
También tenga en cuenta que 'int * ptr = 0;' siempre da como resultado un puntero nulo gracias a una regla especial, porque '0' es un llamada "constante de puntero nulo". Esto se mantiene incluso si se encuentra en alguna implementación peculiar donde un puntero nulo es diferente de la dirección 0. Sin embargo, 'int i = 0; int * ptr = (int *) i; 'no da necesariamente como resultado un puntero nulo. Por lo tanto, normalmente no encontrará "un puntero que apunta a la dirección 0", excepto en un contexto en el que es un puntero nulo, pero el estándar lo permite. –
@David, en su segundo párrafo quiere decir "no", ¿verdad? Y 'NULL' es siempre un valor' 0' por definición del estándar, que podría ser una dirección válida, por ejemplo, en el kernel. Entonces uno debería distinguir mejor a 'NULL' más claramente de la representación interna de un puntero nulo, que, como dices podría ser algo diferente. –