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.