ponteiro constante vs ponteiro em um valor constante [duplicado]

Esta questão já tem uma resposta aqui:

Qual é a diferença entre char * const e const char *? 18 respostas

Qual é a diferença entre as seguintes declarações?

<code>char * const a;
const char * a;
</code>

Para entender a diferença, escrevi este pequeno programa:

<code>#include <stdio.h>
#include <stdlib.h>


int main (int argc, char **argv)
{
    char a = 'x';
    char b = 'y';

    char * const pc1 = &a;
    const char * pc2 = &a;

    printf ("Before\n");
    printf ("pc1=%p\n", pc1);
    printf ("*pc1=%c\n", *pc1);
    printf ("pc2=%p\n", pc2);
    printf ("*pc2=%c\n", *pc2);

    *pc1 = b;
/*     pc1 = &b; */

/*     *pc2 = b; */
    pc2 = &b;

    printf ("\n\n");

    printf ("After\n");
    printf ("pc1=%p\n", pc1);
    printf ("*pc1=%c\n", *pc1);
    printf ("pc2=%p\n", pc2);
    printf ("*pc2=%c\n", *pc2);

    return EXIT_SUCCESS;
}
</code>

Eu compilei o programa (com o gcc 3.4) e rodei-o. A saída destaca a diferença bastante bem:

<code>Before
pc1=ffbfd7e7
*pc1=x
pc2=ffbfd7e7
*pc2=x


After
pc1=ffbfd7e7
*pc1=y
pc2=ffbfd7e6
*pc2=x
</code>

No entanto, eu tive que escrever o pequeno programa para obter a resposta. Caso eu esteja longe da máquina (em uma entrevista, por exemplo), eu não seria capaz de responder à pergunta.

Alguém pode por favor explicar, comentando o exemplo acima, como oconst palavra-chave opera?

questionAnswers(11)

yourAnswerToTheQuestion