sirven que punteros puntero para los estructura ejemplo dev datos cadenas aritmetica apuntadores c++ c null language-lawyer nullptr

que - punteros c++ pdf



¿Son estos punteros nulos, o son punteros a la dirección 0? (3)

Si escribo

int zero = 0; void *p1 = (void *)0; void *p2 = (void *)(int)0; void *p3 = (void *)(0 /*no-op, but does it affect the next zero?*/, 0); void *p4 = (void *)zero; // For reference, this is a pointer to address zero void *p5 = 0; // For reference, this is a null pointer void *p6 = NULL; // For reference, this is a null pointer void *p7 = nullptr; // For reference, this is a null pointer (C++11) static const int static_zero_1 = 0; // Is this a literal zero when used? static const int static_zero_2 = 1 - 1; // No "literals 0" per se... is it? void *p8 = (void *)static_zero_1; // I have seen weird substitution rules... void *p9 = (void *)static_zero_2; // do they apply for NULL too?

cuál de p1 , p2 y p3 ( edición: agregué p8 y p9 ) serían punteros nulos (es decir, == NULL , podría o no ser una dirección cero), y cuáles de ellos serían punteros con la dirección cero (podrían o no puede ser == NULL )?

Si la respuesta es diferente en C y C ++, ¿qué hay en cada uno de ellos?


¿ p1 de p1 , p2 y p3 serían punteros nulos?

En C ++ 11, todos ellos. Según el párrafo 4.10 / 1 del Estándar C ++ 11:

Una constante de puntero nula es una expresión constante constante (5.19) prvalue de tipo entero que se evalúa a cero o un prvalue de tipo std::nullptr_t . [...]

Por lo tanto, de acuerdo con la terminología del Estándar, todo lo que es una expresión constante (integral) y se evalúa a 0 es una constante de puntero nulo (aún no es un puntero nulo ). La única que no es una expresión constante que se evalúa a 0 o un valor predeterminado de tipo nullptr_t en su ejemplo es zero , porque no es una expresión constante.

El párrafo continúa:

Una constante de puntero nula se puede convertir en un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo y se distingue de todos los demás valores del puntero de objeto o del tipo de puntero de función. Dicha conversión se denomina conversión de puntero nulo . Dos valores de puntero nulo del mismo tipo se compararán iguales.

Entonces, en su ejemplo, todos los punteros, excepto p4 son valores de puntero nulo y se comparan iguales entre sí.


Y para completar la respuesta de Andy con C:

De la norma C99 :

6.3.2.3 Punteros

1 Un puntero para anular se puede convertir en un puntero a cualquier tipo de objeto incompleto o desde un puntero. Un puntero a cualquier tipo de objeto o incompleto se puede convertir en un puntero para anular y viceversa; El resultado se comparará igual al puntero original.

3 Una expresión de constante entera con el valor 0 , o una expresión de este tipo convertida en tipo void * , se denomina constante de puntero nula . 55) Si una constante de puntero nulo se convierte en un tipo de puntero, se garantiza que el puntero resultante, llamado puntero nulo, comparará desigual a un puntero con cualquier objeto o función.

Por lo tanto, cualquier expresión de constante entera que se evalúe como 0 es una constante de puntero nulo y se puede convertir en un puntero NULL . Efectivamente en su ejemplo, todos los punteros hasta, excepto p4 , p8 y p9 son punteros nulos. p4 , p8 y p9 no necesitan ser punteros nulos ya que su inicialización no es una expresión constante porque contiene variables (incluso si const que const calificadas).

Aquí hay otra respuesta sobre NULL en C ++ , para el registro.


p1 y p2 son punteros nulos; p3 es la implementación definida, y puede ser otra cosa. (Un operador de coma no puede ser parte de una expresión constante. Y la asignación de un valor integral no constante 0 a un puntero está definida por la implementación). C es idéntica a C ++ aquí.

p8 y p9 son ambos punteros nulos en C ++, pero no en C.

Con respecto a su comentario sobre static_zero_2 , no hay ningún requisito en ninguno de los idiomas de que exista un cero literal en cualquier lugar. g ++ define NULL como el compilador integrado __null , por ejemplo, y puede usar (1 - 1) , o ''/0'' , o cualquier otra expresión constante que evalúe a 0.