top of page
Rechercher

Les Pointeurs en C

  • Photo du rédacteur: Renaud Jordi
    Renaud Jordi
  • 29 août
  • 2 min de lecture

Dernière mise à jour : 28 sept.

C’est bientôt la rentrée !

Et l’occasion de réviser les pointeurs 🙂


Rappelons les bases.

Un pointeur est une variable comme une autre, utilisée pour stocker une adresse. Sa taille dépend donc de l’architecture utilisée. Le type d’objet pointé n’est pas stocké, mais doit être connu par le compilateur pour la manipulation.


Nous avons donc ce type de déclaration :

-pointed-object-type- * -const?- var;


Un pointeur de char ? char * p_char;

Un pointeur de const long ? const long * p_const_long;

Un pointeur constant (non modifiable) de short ? short * const p_short;


Quant à l’affectation, elle peut se faire au moment de la déclaration ou plus tard, comme n’importe quelle variable. Sauf comme pour n’importe quel const, qui doit se faire au moment de la déclaration.


Par contrainte de langage, nous sommes forcés d’utiliser l’opérateur & pour récupérer l’adresse d’une variable et la stocker dans un pointeur. Cela garantit l’accès à une zone définie. Mais les plus téméraires connaissent bien des tricks pour aller pointer sur n’importe quelle adresse 🙂

const long * p = &magic_number;

Exception faite avec les chaines de caractères (stockée ici en stack)

char * p_string = “Hello, world!”;

Ou avec les tableaux

short array[42];
short * p = array;

Maintenant un peu d’arithmétique avec les pointeurs 🙂

Car si l’initialisation se fait à l’aide de &, on peut ensuite se déplacer à droite ou à gauche en mémoire avec l’addition et la soustraction.

Attention cependant, l’unité de déplacement est toujours de la taille d’une donnée pointée…


Ainsi, pour reprendre l’exemple au-dessus, l’opération p=p+1 (ou p++) pointera sur le short suivant.

C’est malheureusement une erreur courante lors de la manipulation mémoire que d’oublier ce facteur.

struct t_header {
    long magic_number;
    long version;
    long body_length;
} header;

struct t_header * p_header = &header;

Pour accéder au body_length, il est tentant de faire un p_header+=8; Or cette opération déplacera le pointeur de 8 fois la taille de la structure pointée…

Ici l’exemple peut prêter à rire, mais gardez-le en tête pour vos sessions de debug avec des pointeurs 😀


Dernier point, la soustraction de pointeurs.

Très utile pour compter le nombre d’éléments (et non le nombre d’octets si vous avez bien suivi ;) ) séparant les 2 pointeurs. Cela ne peut évidemment se faire qu’avec les pointeurs du même type (garanti par le compilateur) et vous retournera un entier.


Logo LH&Tech avec rappel du titre "Pointeurs" et exemple de definition de poitneur

 
 

© LH&TECH, tous droits réservés.

bottom of page