visual una tres tipos tengan son significados significado retornan resumen reciben que principales predefinidas persona palabras paises otros otra multiples mismo maximo lista lenguaje las inteligencias instrucciones hace funciones funcionalidad funcion float español entero distintas diferentes define cuales cosa constantes con comandos codigos clases atributo c const declaration function-signature

una - ¿Cuál es el significado de múltiples calificadores const?



tres tipos de funciones en c++ (4)

En su ejemplo, todos, excepto el nivel superior de direccionamiento, todos están calificados.

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 un argumento int y devuelve un puntero normal.
El puntero que devuelve apunta a un puntero cualificado const
que, a su vez, apunta a otro puntero const cualificado.
lo que apunta a const calificado char

Código:

const char* const* const* foo(int bar);

He visto dobles constantes antes que impiden la modificación del puntero también. La primera vez que he visto triple const en mi vida. Preguntándose cuál es su uso.


Hah - la confusión alrededor de const .

Básicamente, si califica un puntero, entonces se aplica al puntero inmediatamente a su izquierda. Por ejemplo:

char *const c;

hace que c sea ​​un puntero de solo lectura para char , mientras que

const char *c;

Hace de c un puntero a un char solo lectura, aunque puede cambiar a donde c apunta.

Por supuesto, tanto el puntero como lo que apunta pueden hacerse de solo lectura:

const char *const c;

Esto hace que c sea ​​un puntero de solo lectura para un caracter de solo lectura. Con la declaración anterior, puede modificar *c , pero no puede modificar c (es decir, no puede hacer que apunte a otra parte). Con el segundo, puede asignar a c pero no a *c , y con el tercero, no puede modificar a dónde apunta, ni tampoco puede modificar el objeto apuntado.

Esto se extiende a múltiples niveles de indirección. Para su caso, es posible que desee reagrupar las palabras clave const con el puntero coincidente que califican. Esto es principalmente un problema de espacios en blanco, pero sería así:

const char *const *const *foo(int bar);

Lo que hace que foo devuelva un puntero a un puntero de solo lectura a un puntero de solo lectura a un char solo lectura. Lea esto detenidamente: tenga en cuenta que dado este fragmento de código:

const char *const *const *ptr = foo(0);

Entonces sabe que la asignación a ptr es legal, pero cualquier otra asignación es ilegal, es decir, no puede asignar a *ptr , **ptr , y ***ptr .


Si tiene un puntero multinivel, tiene varias variables de puntero. Ejemplo:

char*** foo;

Se accede de esta manera:

| 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, es mejor evitar convertirse en un programador de tres estrellas.


foo devuelve un pointer que apunta a un constant pointer que apunta a otro constant pointer que apunta a un constant char . Echa un vistazo a la regla de la espiral .

int bar; const char* const* const* ptr = foo(bar);

Así que básicamente no puedes cambiar ninguno de *ptr o **ptr o ***ptr .