Rappel : Notion de pointeur et enregistrement Rappel : Notion de pointeur Stru

Rappel : Notion de pointeur et enregistrement Rappel : Notion de pointeur Structure dynamique  Une variable est dite statique si elle est déclarée dans un algorithme et associée à un identificateur  Elle est créée pendant la phase de compilation et l’espace occupé en mémoire reste constant  Son domaine de valeurs admises et les instructions qui peuvent être appliqués sont bien déterminés à l’avance exemple : Les types statiques : de base – entier, réel, caractères, booléen enregistrements Rappel : Notion de pointeur  Une variable est dite dynamique si elle est créée en cours d’exécution  Elles ne sont donc pas déclarées et ne sont donc pas repérées par des identificateurs mais par des entités mémoires (ou variables) de type pointeur qui ne sont rien d’autres que l’adresse mémoire de la variable générée. Rappel : Notion de pointeur Définition Un pointeur est une variable qui contient l’adresse d’une autre variable dans la mémoire. Les pointeurs sont typés : si T dénote un type, alors ^T dénote le type "adresse d'un objet de type T". Déclaration La déclaration d’une variable de type pointeur se fait de la manière suivant En algorithmique : Nom_variable : ^Type Exemple p,p1 :^entier Rappel : Notion de pointeur  Nom_variable^ est la variable pointée par Nom_variable  La déclaration d’une variable de type pointeur ne réserve pas un espace mémoire pour la variable pointée. Rappel : Notion de pointeur Opérations sur les pointeurs L’affectation d’un pointeur p à un pointeur p1 de même type que p. p,p1 : ^Type p1 ← p l'addition d'un entier à un pointeur. Le résultat est un pointeur de même type que le pointeur de départ. p,p1 : ^Type n : entier p1 ← p+n Rappel : Notion de pointeur la soustraction d'un entier à un pointeur. Le résultat est un pointeur de même type que le pointeur de départ. p,p1 : ^Type n : entier p1 ← p-n la différence de deux pointeurs pointant tous deux vers des objets de même type. Le résultat est un entier. p,p1 : ^Type n : entier n ← p1-p Notons que la somme de deux pointeurs n'est pas autorisée. Rappel : Notion de pointeur Allocation La fonction nouveau (^T), permet de réserver une zone mémoire de taille égale à la taille d’une variable de type T. La fonction renvoie l’adresse de cette zone mémoire qui sera sauvegardée dans une variable de type pointeur sur T. Exemple p ← nouveau (^entier) Destruction La fonction liberer (p), permet de libérer la zone mémoire dont l’adresse se trouve dans p. Exemple liberer(p) Rappel : Les pointeurs en C Déclaration type * nom de var Exemple : déclaration d'un pointeur sur int int *p; Initialisation avec NULL Un pointeur avec la valeur NULL est un pointeur qui n'a pas de cible. p = NULL; Affectation avec une adresse de variable int a; ... p = &a; Rappel : Les pointeurs en C int *px; px=&x; Rappel : Les pointeurs en C Exemple int * p; Rappel : Les pointeurs en C Exemple int * p; int a=4; Rappel : Les pointeurs en C Exemple int * p; int a=4; p = &a; p « pointe » sur a &a : adresse de a Rappel : Les pointeurs en C Exemple int * p; int a=4; p = &a; int b; Rappel : Les pointeurs en C Exemple int * p; int a=4; p = &a; int b; b = *p; *p contenu de la variable pointée par p ou « déréférencement » de p Rappel : Les pointeurs en C Type d'un pointeur float a=4.0; int * p = &a;  Erreur de compilation: un pointeur est un pointeur sur des variables d'un type donné. float a=4.0; float * p = &a; Une variable de type truc * pointe sur un truc Les erreurs Un pointeur non initialisé sur une adresse de variable ne peut être déréférencé. int * p; int b; b = *p;  Erreur d'exécution int * p = NULL; int b; b = *p;  Erreur d'exécution Rappel : Les pointeurs en C Utilisation de NULL On affecte NULL quand un pointeur ne sert plus ou pas encore Le pointeur est mis à NULL  Après utilisation: p = &a; ... b = *p; ... p = NULL; A la déclaration : int * p = NULL; ... p = &a; Avant d'utiliser un pointeur on teste sa valeur: if (p!=NULL) { ... b = *p; ...} else { ... } Rappel : Les pointeurs en C Allocation dynamique L'allocation dynamique de mémoire en langage C peut être réalisée via la fonction malloc() de la bibliothèque <stdlib.h> void * malloc ( size_t t ) Exemple : int * p; p = malloc (sizeof(int)); Libération de mémoire free(void *ptr): libère le bloc mémoire d’adresse ptr précédemment alloué par un malloc Rappel : Les pointeurs en C Allocation dynamique 3étapes : 1. Appeler malloc pour demander de la mémoire : int* memoireAllouee = NULL; memoireAllouee = malloc(sizeof(int)); 2. Vérifier la valeur retournée par malloc pour savoir si l'OS a bien réussi à allouer la mémoire ; if (memoireAllouee == NULL) // Si l'allocation a échoué { exit(0); // On arrête immédiatement le programme } 3. Une fois qu'on a fini d'utiliser la mémoire, on doit la libérer avec free Free(memoireAllouee) Rappel : Les pointeurs en C Exemple 1 : int a = 1; int * p = &a; int b = *p; a = 2; b = 3; p = &b; a = 4; b = 5; Quelle est la valeur des différentes variables après chaque instruction. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 1, b = 1, *p = 1. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 2; a = 2, b = 1, *p = 2. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 2; b = 3; a = 2, b = 3, *p = 2. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 2; b = 3; p = &b; a = 2, b = 3, *p = 3. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 2; b = 3; p = &b; a = 4; a = 4, b = 3, *p = 3. Rappel : Les pointeurs en C Exemple 1 int a = 1; int * p = &a; int b = *p; a = 2; b = 3; p = &b; a = 4; b = 5; a = 4, b = 5, *p = 5. Rappel : Les pointeurs en C Exemple 2 : int a = 1; int b = 2; int * p = &a; int * q = p; a = 3; b = *q + 10; Quelle est la valeur des différentes variables après chaque instruction. Rappel : Les pointeurs en C Exemple 2 int a = 1; int b = 2; a = 1, b = 2. Rappel : Les pointeurs en C Exemple 2 int a = 1; int b = 2; int * p = &a; a = 1, b = 2, *p = 1 Rappel : Les pointeurs en C Exemple 2 int a = 1; int b = 2; int * p = &a; int *q = p; a = 1, b = 2, *p = 1, *q = 1. Rappel : Les pointeurs en C Exemple 2 int a = 1; int b = 2; int * p = &a; int *q = p; a = 3; a = 3, b = 2, *p = 3, *q = 3. Rappel : Les pointeurs en C Exemple 2 int a = 1; int b = 2; int * p = &a; int *q = p; a = 3; b = *q + 10; a = 3, b = 13, *p = 3, *q = 3. Rappel : Les pointeurs en C Exemple 3 : int a = 1; int b = 2; int * p = &a; int * q = &b; printf("a = %d, b = %d.\n", a, b); printf("*p = %d, *q = %d.\n", *p, *q); printf("&a = %p, &b = %p.\n", &a, &b); printf(" p = %p, q = %p.\n", p, q); // %p est le format d'entrée sortie d'un pointeur. Quelle est la valeur des différentes variables après chaque instruction. Rappel : Les pointeurs en C Exemple 3 : int a = 1; int b = 2; int * p = &a; int * q = &b; Rappel : Les pointeurs en C Exemple 3 : a = 1, b = 2. uploads/Ingenierie_Lourd/ asdc-21-22-part3.pdf

  • 23
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager