Les Pointeurs - Jihene Tounsi

Notion de pointeurs
ALGORITHME ET
STRUCTURES DE DONNÉES II
LES POINTEURS
Une variable qui contient l’adresse d’une autre
variable
Un pointeur est souvent typé (rarement générique)
Il peut se déplacer d’une case mémoire à une autre
rapidement
Manipulation
directe de la mémoire
Utilisation de la mémoire dynamique
Dr. Jihène Tounsi
ISG de Sousse
Site web http://www.jihenetounsi.com
Email: [email protected]
Dans certains langages évolués la notion de
pointeur explicite est éliminée (Exp JAVA)
Cours développé par Dr. Jihène Tounsi
Syntaxe
Exemple 1
Déclaration d’un pointeur en lui attribuant le type
de données vers lequel il peut pointer
Nom_Pointeur:^Type
Variables
A,B:entier
P1,P2: ^entier
Assignation d’une adresse ou d’un objet pointé
Nom_Pointeur&X
Algorithme Exemple;
(avec x de même type que P)
Accès à la valeur de l’objet pointé
Nom_pointeur^
Debut
A3
B6
P1&A
P2&B
P1^P2^
Fin
Pointeur
Cours développé par Dr. Jihène Tounsi
Objet
Adresse
valeur
A
4831836000
6
B
4831836004
6
P1
4831835984
4831836000
P2
4831835992
4831836004
Opérations sur un pointeur
Un pointeur stocke une adresse mémoire et il pointe
vers un objet de type T
Taille du Type (tout dépend du
langage)
La Taille d’une case est 1 octet (8bits)
Un pointeur est de type entier, indépendamment de l’objet
vers lequel il pointe.
Les opérations à appliquer
Addition d’un pointeur avec un entier
P2=P1+i avec i un entier
P2 aura la valeur de l’adresse de P1 incrémenté de
i*(taille(type))
Type
Taille minimal en
octet
Valeurs
Entier (court)
1
-127 à 128
Entier (normal)
2 (ordinateur 16bits)
4 (ordinateur 32bits)
16 (ordinateur 64 bits)
−2n à +2n
1
Tous les
caractères
Même logique que l’addition
Différence de deux pointeurs ayant le même type
P-Q est un entier calculé par la formule : (P-Q)/taille(type)
Gestion des pointeurs
Création du pointeur
Déclaration et assignation d’un type
Nom_Pointeur:^type
Initialisation (un pointeur non initialisé peut pointer n’importe
où)
Vers une donnée valide et statique de même type
En lui assignant la valeur « Null »
En allouant dynamiquement une zone mémoire vers laquelle le
pointeur va pointer
Exemple 2
Algorithme Exemple;
Objet
Adresse
P1
4831835984
valeur
Variables
P1: ^entier
Debut
Nouveau(P1)
P1+1
P1^2
(P1+1)^4
Ecrire(P1, P1^, (P1+1), (P1+1)^)
Fin
Nouveau(nom_pointeur)
Destruction du pointeur
Caractère
Soustraction d’un entier à un pointeur
Avec n =nombre des
bits -1
Appel de la fonction prédéfinie : Détruire(nom_pointeur)
La valeur pointée est détruite
P.S: à considérer la machine pour définir la taille d’un entier
Pointeur et tableau
Créer un tableau dynamiquement
Exp: P&tab
P
va pointer sur l’@ de la première case du tableau
P[i] = (p+(i-1))^ = tab[i]
Exp : P[2]=(p+1)^= tab[2]=4
P
2
0
Tab
8
Les enregistrements
Classiquement
Un
Enregistrement est une allocation statique d’une
adresse mémoire ayant comme taille l’ensemble des
octets nécessaires pour tous ses champs
…Pour des raisons d’optimisation de la mémoire
Nous
Demander
4
pouvons déclarer un pointeur sur un
enregistrement (Exemple 3)
Ou même un champs de l’enregistrement de type
pointeur
La taille du tableau n’est pas connu à l’avance
la taille du tableau au cours du traitement
Un pointeur qui va jouer le rôle du tableau
Allocation dynamique selon le nombre d’éléments
du tableau
Initialisation des éléments du tableau
Libération de l’espace mémoire en cas de besoin
Eviter l’allocation inutile de la mémoire
Exemple 3
Algorithme Exp3;
Personne=enregistrement
nom:chaîne
age:entier
Fin enregistrement
Variable
P:^Personne
Debut
//Allocation dynamique d’une case de type personne
Nouveau(P)
//Accès au champs un par un
P^.nom=« flen »
P^.age=23
Ecrire(P^.nom, P^.age)
//Libérer la mémoire
Détruire (P)
Fin.
Fin chapitre 1….