2012-08-08 24 views

Respuesta

13

No son lo mismo.

El primero designa un const-pointer-to-char, el segundo es un puntero-a-const-char.

Trate de leer de derecha a izquierda:

const char *p; // p is a pointer to char which is const 
char const *p; // p is a pointer to const char (same as previous) 
char * const p; // p is a const pointer to char 
char const * const p; // p is a const pointer to const char 

Al utilizar el typedef typedef char* c de empacar el significado "puntero a char" en un solo alias c:

const c p; // p is a const [c] --> p is a const [pointer to char] 

explicaciones adicionales :

typedefs no están en el lugar expandieron como macros son, es decir,

const c p; 

realmente se convierte en

const [char*] p; 

no se convierta en

const char* p; // Nope. 

no se expanden como si fuera macros en su mente, con typedefs, ha vinculado char y * juntos y formó un átomo.

+0

Esto es interesante. Estoy realmente sorprendido. +1 –

+1

Lo sé, pero cuando el compilador no debería tratarlo como * const char * *, porque * c * se está expandiendo a * char * *, eso es lo que estoy preguntando. – cirronimbo

+0

@cirronimbo: consulte la sección "usando typedef" en mi respuesta. –

3

ptr1 es una const (char *), lo que significa el puntero en sí es un const, mientras que ptr2 es una (const char) *, que significa que el objetivo del puntero se const.

0

tiene que ver con la forma en que c agrupa las cosas internamente. Un typedef no es como una macro, no solo sustituye las cosas en. Si tuvieras pus paréntesis en esto se vería así.

const (char*) ptr1 = "pointer"; 
(const char)* ptr2 = "pointer"; 
0

Escribirlo como:

typedef char* c; 
c const ptr1 = "pointer"; 
++ptr1; /// error 
char const* ptr2 = "pointer"; 
++ptr2; /// runs fine 

hace la diferencia más visible, y esto debe ser el mismo que el ejemplo

Cuestiones relacionadas