150 votes

pointeur constant vs pointeur sur une valeur constante

Quelle est la différence entre les déclarations suivantes?

char * const a;
const char * a;

Afin de comprendre la différence que j'ai écrit ce petit programme:

#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", *pc1);

    *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", *pc1);

    return EXIT_SUCCESS;
}

J'ai compilé le programme (avec gcc 3.4) et il a couru. La sortie met en évidence la différence plutôt bien:

Before
pc1=ffbfd7e7
*pc1=x
pc2=ffbfd7e7
*pc2=x


After
pc1=ffbfd7e7
*pc1=y
pc2=ffbfd7e6
*pc2=y

Cependant, j'ai dû écrire le petit programme pour obtenir la réponse. Dans le cas où je suis loin de la machine (lors de l'entrevue, par exemple), je ne serais pas en mesure de répondre à la question.

Quelqu'un peut expliquer, en commentant l'exemple ci-dessus, comment l' const mot clé fonctionne?

187voto

Alok Save Points 115848
char * const a;

signifie que le pointeur est constant et immuable, mais le relevé des données n'est pas.
Vous pouvez utiliser const_cast(en C++) ou de type c cast cast away la constness dans ce cas que les données lui-même n'est pas constante.

const char * a;

signifie que le relevé des données est constant et immuable, mais le pointeur ne l'est pas.
À l'aide d'un const_cast(C++) ou de type c cast cast away la constness dans ce cas, provoque un Comportement Indéfini.

103voto

AAT Points 1191

Pour analyser les types complexes, vous commencez à la variable, allez à gauche, et la spirale vers l'extérieur. Si il n'y a pas de tableaux ou de fonctions à s'inquiéter (parce que ces s'asseoir à la droite du nom de la variable) cela devient un cas de lecture de droite à gauche.

Donc, avec char *const a; vous avez a, ce qui est un const pointeur (*) à un char. En d'autres termes, vous pouvez modifier le char qui a la montre, mais vous ne pouvez pas faire d' a point à quelque chose de différent.

À l'inverse d' const char* b; vous avez b, ce qui est un pointeur (*) à un char qui const. Vous pouvez faire b point à n'importe quel char que vous aimez, mais vous ne pouvez pas modifier la valeur de ce char à l'aide de *b = ...;.

Vous pouvez aussi, bien sûr, avoir à la fois des saveurs de const-ness à un moment: const char *const c;.

65voto

John Bode Points 33046
char * const a;

*a est accessible en écriture, mais a ne l'est pas; en d'autres termes, vous pouvez modifier la valeur pointée par a, mais vous ne pouvez pas modifier a lui-même. a est un pointeur constant char.

const char * a; 

a est accessible en écriture, mais *a ne l'est pas; en d'autres termes, vous pouvez modifier a (pointant vers un nouvel emplacement), mais vous ne pouvez pas modifier la valeur pointée par a.

Notez que c'est identique à l'

char const * a;

Dans ce cas, a est un pointeur vers un const char.

16voto

John Vincent Points 21

La meilleure façon de comprendre la différence est de réfléchir aux différentes possibilités. Il y a deux objets à examiner, le pointeur et l'objet pointé (dans ce cas, 'a' est le nom du pointeur de la souris, l'objet pointé est sans nom, de type char). Les possibilités sont:

  1. rien n'est const
  2. le pointeur est const
  3. l'objet pointé est const
  4. à la fois le pointeur et l'a signalé à l'objet sont const.

Ces différentes possibilités peuvent être exprimées en C, comme suit:

  1. char * a;
  2. char * const;
  3. const char * a;
  4. const char * const;

J'espère que cet illustre les différences possibles

12voto

cnicutar Points 98451

Le premier est un pointeur constant sur un char, et le second est un pointeur vers une constante char. Vous ne touchez pas à tous les cas dans votre code:

char * const pc1 = &a; /* You can't make pc1 point to anything else */
const char * pc2 = &a; /* You can't dereference pc2 to write. */

*pc1 = 'c' /* Legal. */
*pc2 = 'c' /* Illegal. */

pc1 = &b; /* Illegal, pc1 is a constant pointer. */
pc2 = &b; /* Legal, pc2 itself is not constant. */

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X