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
dep1
,p2
yp3
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:
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.