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?
¿
p1dep1,p2yp3serí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:
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 tipovoid *, 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.