¿Cuál es el significado de múltiples calificadores constantes?
-
21-12-2019 - |
Pregunta
Código:
const char* const* const* foo(int bar);
He visto constantes dobles antes que también impiden la modificación del puntero.Primera vez que veo triple const en mi vida.Se pregunta para qué sirve.
Solución
En su ejemplo, todos menos el nivel superior de indirección, todos const
calificado.
const char /* const qualified base level */
*const /* const qualified level 1 */
*const /* const qualified level 2 */
* /* regular level 3 */
foo(int bar);
foo
es una función que acepta una int
argumento y devuelve un puntero regular.
El puntero que devuelve apunta a un const
puntero calificado
que, a su vez, apunta a otra const
puntero calificado
que apunta a const
calificado char
Otros consejos
Si tiene un puntero multinivel, tiene varias variables de puntero.Ejemplo:
char*** foo;
Se accede a así:
| foo | pointer1 | pointer2 | string |
| ^ | ^ | ^
\___/ \___/ \___/
Puede calificar cada una de las cuatro ubicaciones en la memoria como const
, como en la Declaración
const char *const *const *const foo;
Sin embargo, mejor evita convertirse en un programador de tres estrellas.
Ja, la confusión alrededor const
.
Básicamente, si califica un puntero, se aplica al puntero inmediatamente a su izquierda.Por ejemplo:
char *const c;
marcas c
un puntero de sólo lectura a char
, mientras
const char *c;
Marcas c
un puntero a un solo lectura char
, aunque puedes cambiar dónde c
puntos a.
Por supuesto, tanto el puntero como lo que apunta se pueden convertir en de sólo lectura:
const char *const c;
Esto hace c
un puntero de solo lectura a un puntero de solo lectura char
.Con la declaración anterior se puede modificar *c
, pero no puedes modificar c
(es decir.no puedes hacer que apunte a otro lugar).Con el segundo, puedes asignar a c
pero no para *c
, y con el tercero, no puedes modificar hacia dónde apunta, ni puedes modificar el objeto al que apunta.
Esto se extiende a múltiples niveles de indirección.Para su caso, es posible que desee reagrupar el const
palabras clave con el indicador coincidente que califican.Esto es principalmente un problema de espacios en blanco, pero sería así:
const char *const *const *foo(int bar);
Que hace foo
devolver un puntero a un puntero de solo lectura a un puntero de solo lectura a un puntero de solo lectura char
.Léelo con atención:tenga en cuenta que dado este fragmento de código:
const char *const *const *ptr = foo(0);
Entonces sabes que asignar a ptr
es legal, pero cualquier otra cesión es ilegal, es decir, no se puede ceder a *ptr
, **ptr
, y ***ptr
.
foo
devuelve un pointer
lo que apunta a un constant pointer
que apunta a otro constant pointer
lo que apunta a un constant char
.Echa un vistazo a regla espiral.
int bar;
const char* const* const* ptr = foo(bar);
Así que básicamente no puedes cambiar ninguno de *ptr
o **ptr
o ***ptr
.