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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top