Mientras que el problema ya está resuelto por las respuestas anteriores, no se pierda la razón por la ...
Así que tal vez como una regla de oro:
- El
const
siempre se refiere a que es símbolo predecesor.
- En caso de que no exista, es "intrincado" su token sucesor en su lugar.
Esta regla realmente puede ayudar a declarar un puntero a punteros const o algo igualmente limpio.
De todos modos, con esto en mente, se debe tener claro qué
struct Person *const person = NULL;
declara un puntero const a una estructura mutable.
pensar en ello, sus typedef "grupos" la struct Person
con el puntero símbolo *
. Por lo tanto, para escribir
const PersonRef person = NULL;
su compilador ve algo como esto (pseudo-código):
const [struct Person *]person = NULL;
Como no hay nada que const
's la izquierda, que deklares el testigo al que esté bien struct Person *
constante.
Bueno, creo que esta es la razón por la que no me gusta ocultar punteros por typedefs, mientras que me gustan los typedefs como tal. ¿Qué hay de escribir
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
y debería ser bastante claro para los compiladores y los seres humanos, lo que estás haciendo.
"Pero la palabra clave const no debe hacer que el puntero sea const". ¿Huh? Respuesta corta: no use typedefs, solo están ahí para confundirlo. Recuérdalos hasta que los necesites. – wildplasser
@wildplasser: "No use typedefs" no es un buen consejo. Tal vez "No ocultar punteros detrás de typedefs" es más apropiado ... –
Me gustaría diferir. Es * un * buen consejo. Ocultar estructuras detrás de un typedef es tan confuso como ocultar punteros. Solo sirve para contaminar tu espacio mental. Incluso sin resaltar la sintaxis, leí "struct person * p" más fácil y rápido que "pPerson p". – wildplasser