Accueil
 1  Espace mémoire d'un processus
 2  Adresse mémoire
 3  Pointeur
 3.1  Déréférencement
 3.2  Tableaux et pointeurs (1/3)
 3.3  Tableaux et pointeurs (2/3)
 3.4  Tableaux et pointeurs (3/3)
 3.5  Passage par référence
 4  Allocation dynamique de mémoire

 Contacts

W3C validator

Département INF  
 Titre du cours


3 Pointeur

  • Variable dont la valeur est une adresse mémoire
  • valeur binaire codée sur k bits (k dépend de l’architecture du processeur)
  • déclaration: type* nom_variable;
    • type désigne le type de la donnée “pointée”
  • exemple: char* pa; crée un pointeur sur une donnée de type char:
    // pour lexemple, les adresses sont codees sur 32 bits 
    char a = A; // a est stocke a ladresse 0x0000FFFF 
                  // la valeur de a est 0x41 (’A’) 
    char* pa = &a; // pa est une variable de 32 bits stockee 
                   // aux adresses 0xFFFB a 0xFFFE 
                   // la valeur de pa est 0x0000FFFF (ladresse de a)

Figures/memoire2

    previous     next 


On peut ensuite manipuler l’adresse de a (0xFFFF) ou la valeur de pa (0xFFFF) indifféremment:

      printf("&a = \%p\n", &a); // affiche 0xFFFF 
      printf("pa = \%p\n", pa); // affiche 0xFFFF 
      printf("&pa = \%p\n", &pa); // affiche 0xFFFB, soit ladresse de pa

Un pointeur étant une variable comme les autres, on peut donc stocker son adresse dans un pointeur. Par exemple:

      char a = A; // a est stockee a ladresse 0xFFFF et contient 0x41 (’A ou 65) 
      char* pa = &a; // pa est stockee a ladresse 0xFFFB et contient 0xFFFF (ladresse de a) 
      char** ppa = &pa; // ppa est stockee a ladresse 0xFFF7 et contient 0xFFFB (ladresse de pa)

Conseil de vieux baroudeur Quand vous déclarez un pointeur, initialisez-le immédiatement, soit avec l’adresse d’une variable, soit avec la valeur NULL (définie dans stdlib.h) qui est la valeur pointant sur "rien". Dit autrement, ne laissez jamais une variable pointeur avec un contenu non initialisé.

Arithmétique de pointeur Les opérateurs +, -, ++, et -- sont utilisables sur des pointeurs, mais avec précaution.

Incrémenter un pointeur sur type aura pour effet d’ajouter sizeof(type) à la valeur du pointeur. Par exemple:

char* pa = &a;  // pa vaut 0xFFFF 
pa--;           // enleve sizeof(char) (cest a dire 1) a pa 
                // donc pa vaut 0xFFFE 
 
char**ppa = &pa // ppa vaut 0xFFFB 
ppa--;          // enleve sizeof(char*) (cest a dire 4) a ppa 
                // donc ppa vaut 0xFFF7 
 
ppa = ppa - 2;  // soustrait 2*sizeof(char*) (donc 8) a ppa 
                // ppa vaut 0xFFEF

Exemple complet Sur https://codecast.france-ioi.org/, vous pouvez visualiser le contenu de la mémoire d’un programme. Pour cela, saisissez le code source du programme, cliquez sur “compiler”, puis exécutez le programme pas à pas en cliquant sur “next expression”. À chaque instant, le contenu de la mémoire est représenté en bas de la page. Essayez avec ce programme:


0cAp1x5-90003: exemple_memoire.c
 
#include <stdio.h> 
int main() { 
  //! showMemory(cursors=[a, pa, ppa], start=65528) 
  char a = A; 
  char* pa= &a; 
  char** ppa = &pa; 
 
  printf("a = %d, &a=%p\n", a, &a); 
  printf("pa = %p, &pa=%p\n", pa, &pa); 
  printf("ppa = %p, &ppa=%p\n", ppa, &ppa); 
 
  pa--; // enleve sizeof(char)=1 a pa 
  ppa--; // enleve sizeof(char*) a ppa 
 
  printf("a = %d, &a=%p\n", a, &a); 
  printf("pa = %p, &pa=%p\n", pa, &pa); 
  printf("ppa = %p, &ppa=%p\n", ppa, &ppa); 
 
  ppa = ppa - 2; // enleve 2*sizeof(char*) a ppa 
  printf("ppa = %p, &ppa=%p\n", ppa, &ppa); 
 
  return 0; 
}

François Trahay, Télécom SudParis, CSC4103 – Programmation système, 2019–2020