de l’ordinateur peut être vu comme une série de cases. Ces cases sont repérées par des adresses. Dans ces cases sont stockées les valeurs des variables (ou des instructions). Adresses valeurs 65775417 123 65775416 3.2132 65775415 ‘M’ 65775414 ‘i’ 65775413 ‘a 65775412 ‘m’ Pour accéder à la valeur d’une variable ( i.e au contenu de la case mémoire) Il faut connaître son emplacement (c’est l’adresse de la variable) Lorsqu’on utilise une variable: Le compilateur manipule son adresse pour y accéder. Cette adresse est alors inconnue du programmeur
Un pointeur est une variable qui contient l’adresse d’une variable. Le stockage en mémoire de la variable (char, int, etc…) est alors sous la responsabilité du programmeur. On dit que le pointeur pointe sur l’objet pointé. Le type du pointeur est construit à partir du type de l’objet pointé. Exemple Déclaration d’un pointeur int * Var ; Nom de la variable Type de l’objet pointé On a déclaré une variable de type « Pointeur sur entier » Cette variable contient l’adresse d’une case mémoire contenant un entier
Opérateur d’adresse * Opérateur d’indirection Soit a une variable et p un pointeur: &a désigne l’adresse de la variable a *p désigne la variable pointée par p Comment accéder à la variable contenue dans un pointeur ? Comment récupérer l’adresse d’une variable ?
int a=0; /* Déclare une variable entière. */ int *p; /* Déclare un pointeur sur un entier. */ p = &a; /* Initialise le pointeur avec l’adresse de cette variable. */ *p = *p + 1; /* Effectue un calcul sur la variable pointée par p, c’est-à-dire sur a lui-même, puisque p contient l’adresse de a. */ /* À ce stade, a ne vaut plus 0, mais 1. */
que les pointeur que l’on manipule sont bien initialisé! Il doivent contenir l’adresse d’une variable valide. En général on initialise les pointeurs à la déclaration. On peut les initialisé comme pointeur NULL. int * Var; // pour le compilateur Var pointe sur quelque chose (n’importe quoi) int * Var = NULL; // le compilateur sait que Var ne pointe sur rien
à une variable existante. int i = 2; int * p; p = &a; 65775417 65775416 65775415 65775414 65775413 65775412 i 2 P = &a = *p 65775415 On stocke dans p, l’adresse de a ->
à une variable existante. int i,j; // i, j variables de type int int * pi, *pj; // pi et pj, variables de type « pointeurs vers int » pi=&i; // le pointeur est initialisé à &i, il pointe à l’adresse &i, donc sur i *pi=2; // accès à l’élément pointé, i est mis à 2 (*pi)++; // incrémente i qui passe à 3 pj=pi; // pj pointe au même endroit que pi (sur i)
++, --, +, = ….. Sont définis pour les pointeurs, mais attention, ils s’appliquent aux adresses. int * p; int a = 3; p = &a; 65775417 123 65775416 12 65775415 156 65775414 3 65775413 9 65775412 456 a p p = &a; -> p pointe sur a
++, --, +, = ….. Sont définis pour les pointeurs, mais attention, ils s’appliquent aux adresses. int * p; int a = 3; p = &a; p++ ; 65775417 123 65775416 12 65775415 156 65775414 3 65775413 9 65775412 456 a p p++; -> p pointe sur l’adresse de l’entier suivant