Langage C Chapitre06

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 58

Introduction

Notion d'un pointeur


Relation entre Pointeur et tableau
Allocation dynamique

Chapitre 1 : Les pointeurs

Hassen NAKBI :: Université de Sousse, ESSTHS


[email protected]

1 ère année Licence

24 janvier 2023

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 1 / 47
Introduction
Notion d'un pointeur
Relation entre Pointeur et tableau
Allocation dynamique

Introduction

En programmation, une variable permet de mémoriser une seule


information. Elle est dénie par son nom, son type et sa valeur.
Elle occupe un espace mémoire précis localisé par une adresse
mémoire.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 2 / 47
Introduction
Notion d'un pointeur
Relation entre Pointeur et tableau
Allocation dynamique

Introduction

Pour accéder à une variable le compilateur fait un lien entre le nom


d'une variable et son adresse en mémoire.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 3 / 47
Introduction
Notion d'un pointeur
Relation entre Pointeur et tableau
Allocation dynamique

Introduction

Pour accéder à une variable le compilateur fait un lien entre le nom


d'une variable et son adresse en mémoire.
Déclaration des variables

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 3 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

2 Notion d'un pointeur


Dénition d'un pointeur
Déclaration d'un pointeur
Arithmétiques des pointeurs
Passage par adresse

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 4 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Dénition d'un pointeur


Un pointeur est une variable particulière qui contient l'adresse
d'une autre variable de même type.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 5 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Dénition d'un pointeur


Un pointeur est une variable particulière qui contient l'adresse
d'une autre variable de même type.

Déclaration des variables

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 5 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

A quoi sert un pointeur ?


Dans un sous programme, pour transmettre le résultat d'un
traitement sur un tableau, ou bien une chaîne de caractères vers le
programme principal, il faut prendre son adresse mémoire, pour
pouvoir travailler sur leur contenu.

Passage par adresse :

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 6 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

2 Notion d'un pointeur


Dénition d'un pointeur
Déclaration d'un pointeur
Arithmétiques des pointeurs
Passage par adresse

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 7 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Syntaxe en algorithmique
VAR p1 : ∧ entier
p2 : ∧ caractère
p3 : ∧ réel

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 8 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Syntaxe en algorithmique
VAR p1 : ∧ entier
p2 : ∧ caractère
p3 : ∧ réel

Algorithme pointeur
VAR a : entier, b :∧ entier
DÉBUT
b ←− @a
b∧ ←− 5
FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 8 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Syntaxe en langage C :
type * nompointeur ;

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 9 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Syntaxe en langage C :
type * nompointeur ;

Programmation avec des pointeurs


short a = 9, b = 4, *ptr1, *ptr2 = NULL ;
ptr1 = &a ;
ptr2 = &b ;
*ptr1 = 5 ;
*ptr2 = 6 ;

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 9 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Syntaxe en langage C :
type * nompointeur ;

Programmation avec des pointeurs


short a = 9, b = 4, *ptr1, *ptr2 = NULL ;
ptr1 = &a ;
ptr2 = &b ;
*ptr1 = 5 ;
*ptr2 = 6 ;
La valeur initiale du pointeur au moment de dénition peut être la
constante "NULL", qui signie la valeur zéro, qui représente
l'absence d'une case mémoire pointée.
Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 9 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Programmation C
Opérateur unaire d'adressage & :
L'opérateur d'adressage & permet de calculer l'adresse numérique
réelle d'une variable située dans la mémoire de l'ordinateur.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 10 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Déclaration d'un pointeur

Programmation C
Opérateur unaire d'adressage & :
L'opérateur d'adressage & permet de calculer l'adresse numérique
réelle d'une variable située dans la mémoire de l'ordinateur.
Opérateur unaire de contenu * :
Une fois qu'un pointeur a été initialisé, l'opérateur * permet
d'accéder à la valeur contenue dans l'adresse pointée.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 10 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

2 Notion d'un pointeur


Dénition d'un pointeur
Déclaration d'un pointeur
Arithmétiques des pointeurs
Passage par adresse

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 11 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

La valeur d'un pointeur étant un entier, on peut lui appliquer un


certain nombre d'opérateurs arithmétiques pour trouver une
information mémoire précise.
Addition avec un entier
Soustraction avec un entier
Diérence entre deux pointeurs.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 12 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Addition
L'addition d'un entier i avec la valeur d'un pointeur ptr donne
comme résultat un pointeur de même type dont la valeur égale :
(ptr + i) * sizeof(type_pointeur).

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 13 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Addition
L'addition d'un entier i avec la valeur d'un pointeur ptr donne
comme résultat un pointeur de même type dont la valeur égale :
(ptr + i) * sizeof(type_pointeur).

Addition
int main(){
short i = 5, z = 3, *ptr1,*ptr2 ;
ptr1 = &z ;
ptr2 = ptr1 + i ;
printf("valeur de ptr %p",ptr2) ;
}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 13 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Soustraction
La soustraction d'un entier i avec la valeur d'un pointeur ptr donne
comme résultat un pointeur de même type dont la valeur égale :
(ptr - i) * sizeof(type_pointeur)

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 14 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Soustraction
La soustraction d'un entier i avec la valeur d'un pointeur ptr donne
comme résultat un pointeur de même type dont la valeur égale :
(ptr - i) * sizeof(type_pointeur)

Soustraction
int main(){
int i = 5, z = 3, *ptr1,*ptr2 ;
ptr1 = &z ;
ptr2 = ptr1 - i ;
printf("valeur de ptr %p",ptr2) ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 14 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Diérence
La diérence de deux pointeurs ptr1 et ptr2 pointant tous les deux
vers des objets de même type, donne un résultat dont la valeur est
égale (ptr1 - ptr2)/sizeof(Type).

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 15 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Arithmétiques des pointeurs

Diérence
La diérence de deux pointeurs ptr1 et ptr2 pointant tous les deux
vers des objets de même type, donne un résultat dont la valeur est
égale (ptr1 - ptr2)/sizeof(Type).

Diérence
int main(){
short i = 5, j = 8, *ptr1,*ptr2 ;
ptr1 = &i ;
ptr2 = &j ;
printf("valeur de ptr %hi",(ptr2 - ptr1)) ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 15 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

2 Notion d'un pointeur


Dénition d'un pointeur
Déclaration d'un pointeur
Arithmétiques des pointeurs
Passage par adresse

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 16 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Pointeur paramètre formel

Pointeur : Passage par adresse


Si on veut transmettre un résultat d'un traitement local d'un sous
programme vers le programme principal, il faut utiliser un
paramètre d'entrée-sortie, il est modélisé par la notion d'un
pointeur en programmation.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 17 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Algorithme sans pointeur


VAR x,y : entier
procédure permuter1(a,b : entier)
VAR c : entier
DÉBUT
c ←− a
a ←− b
b ←− c
FIN a = 9 et b = 5
DÉBUT
x ←− 5
y ←− 9
permuter1(x,y)
FINx = 5 et y = 9 ? ?
Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 18 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Algorithme sans pointeur Algorithme avec pointeur


VAR x,y : entier VAR x,y : entier
procédure permuter1(a,b : entier) procédure permuter2 (a,b :∧ entier)
VAR c : entier VAR c : entier
DÉBUT DÉBUT
c ←− a c ←− a∧
a ←− b a∧ ←− b∧
b ←− c b∧ ←− c
FIN a = 9 et b = 5 FIN
DÉBUT DÉBUT
x ←− 5 x ←− 5
y ←− 9 y ←− 9
permuter1(x,y) permuter2(@x,@y)
FINx = 5 et y = 9 ? ? FINx = 9 et y = 5
Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 18 / 47
Introduction Dénition d'un pointeur
Notion d'un pointeur Déclaration d'un pointeur
Relation entre Pointeur et tableau Arithmétiques des pointeurs
Allocation dynamique Passage par adresse

Passage par adresse

Permutation2 en langage C
#include<stdio.h>
void permuter2(short *a, short *b){
int c ;
c = *a ;
*a = *b ;
*b = c ;}
int main(){
int x = 5,y = 9 ;
permuter2(&x,&y) ;
printf("x = %hi, y =%hi",x,y) ;
return 0 ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 19 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

3 Relation entre Pointeur et tableau


Tableau est un pointeur
Remplissage et achage avec un pointeur
Pointeur comme un paramètre
Chaîne est un pointeur
Notion de pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 20 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Tableau et Pointeur
Le nom de tableau est modélisé comme un pointeur constant qui
mémorise l'adresse de premier élément.
A l'aide de cette adresse, nous pouvons accéder à l'ensemble des
éléments d'un tableau.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 21 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

3 Relation entre Pointeur et tableau


Tableau est un pointeur
Remplissage et achage avec un pointeur
Pointeur comme un paramètre
Chaîne est un pointeur
Notion de pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 22 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Remplissage avec le pointeur

Remplir un tableau
VAR T :TAB et A :∧ entier short T[N], *A ;
DÉBUT int main() {
Pour A de T à T+N-1 for(A=T ;A<T+N ;A++)
pas←−1 faire scanf("%hi",A) ;
Lire(A) return 0 ;}
FinPour
FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 23 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Achage de tableau

Achage de tableau
VAR T :TAB et A :∧ entier short T[N], *A ;
DÉBUT int main() {
Pour A de T à T+N-1 for(A=T ;A<T+N ;A++)
pas←−1 faire printf("%hi",*A) ;
Écrire(A∧ ) return 0 ;}
FinPour
FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 24 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

3 Relation entre Pointeur et tableau


Tableau est un pointeur
Remplissage et achage avec un pointeur
Pointeur comme un paramètre
Chaîne est un pointeur
Notion de pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 25 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Pointeur tableau comme un paramètre

Pointeur comme un paramètre tableau


Procédure void copietab(short *T1,short
copietab(T1,T2 :∧ entier *T2, short N){
,N :entier) short i ;
VAR i : entier for(i=0 ; i<N ; i++)
Début *(T2+i) = *(T1+i) ;
Pour i de 0 à N-1 pas ←− 1 faire }
(T2+i)∧ ←− (T1+i)∧
FinPour
FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 26 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

3 Relation entre Pointeur et tableau


Tableau est un pointeur
Remplissage et achage avec un pointeur
Pointeur comme un paramètre
Chaîne est un pointeur
Notion de pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 27 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Chaîne et Pointeur
Le nom d'une variable chaîne fait référence à un pointeur constant
sur l'adresse de premier caractère.
En eet, cette adresse nous facilite les opérations de remplissage,
traitement et achage d'une chaîne.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 28 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Chaîne et Pointeur
VAR CH : chaîne #include <string.h>
ST : ∧ caractère char CH[25], *ST ;
DÉBUT int main( ){
ST ←− CH ST=CH ;
Lire(ST) gets(ST) ;
Écrire(ST) puts(ST) ;
FIN return 0 ; }

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 29 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

3 Relation entre Pointeur et tableau


Tableau est un pointeur
Remplissage et achage avec un pointeur
Pointeur comme un paramètre
Chaîne est un pointeur
Notion de pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 30 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Pointeur double
Un pointeur simple permet de mémoriser l'adresse d'une variable.
Un pointeur double permet de mémoriser l'adresse d'un pointeur.
Alors, un tableau à deux dimensions est considéré comme un
pointeur double, parce qu'il peut mémoriser l'adresse de premier
pointeur dans une matrice.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 31 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Pointeur double
Un pointeur simple permet de mémoriser l'adresse d'une variable.
Un pointeur double permet de mémoriser l'adresse d'un pointeur.
Alors, un tableau à deux dimensions est considéré comme un
pointeur double, parce qu'il peut mémoriser l'adresse de premier
pointeur dans une matrice.

Algorithme pointeur double


VAR a : entier, b :∧ entier, c :∧∧ entier
DÉBUT
b ←− @a
c ←− @b
b∧ ←− 9
c∧∧ ←− 13
FIN
Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 31 / 47
Introduction Tableau est un pointeur
Notion d'un pointeur Remplissage et achage avec un pointeur
Relation entre Pointeur et tableau Pointeur comme un paramètre
Allocation dynamique Chaîne est un pointeur
Notion de pointeur double

Lecture au clavier par un pointeur double


VAR M1 : ∧∧ entier short **M1 ;
Pour i de 0 à L-1 pas←−1 faire for (i=0 ;i<L ;i++){
Pour j de 0 à C-1 pas←−1 faire for (j=0 ;j<C ;j++){
Lire((M1+i)+j) scanf("%hi",(M1+i)+j)) ;
FinPour }
FinPour }

Achage à l'écran par un pointeur double


Pour i de 0 à L-1 pas←−1 faire for (i=0 ;i<L ;i++){
Pour j de 0 à C-1 pas←−1 faire for (j=0 ;j<C ;j++){
Écrire(((M1+i)∧ +j)∧ ) printf("%hi
FinPour ",*(*(M1+i)+j)) ;
FinPour }
}
Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 32 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

4 Allocation dynamique
Dénition d'allocation dynamique
Avantages de l'allocation dynamique
Segment mémoire tas
Allocation dynamique en langage C
Allocation pour un pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 33 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Dénition
L'allocation dynamique est l'opération qui consiste à allouer et
réserver un espace-mémoire avec une taille dénie par l'utilisateur.
Cette opération permet de créer des types de données, des
tableaux, des chaînes et des structures de toutes tailles au moment
d'exécution d'un programme.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 34 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

4 Allocation dynamique
Dénition d'allocation dynamique
Avantages de l'allocation dynamique
Segment mémoire tas
Allocation dynamique en langage C
Allocation pour un pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 35 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Avantages
L'allocation dynamique permet de créer des tableaux et structures
dynamiques avec des pointeurs qui sont déjà déclarés et de pouvoir
mémoriser l'adresse de la première case allouée.
On peut allouer ou libérer la mémoire à tout moment. `
On peut accéder à la zone de mémoire à partir de n'importe
qu'elle fonction.
On peut décider de modier la taille (augmenter ou diminuer)
d'une zone de mémoire.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 36 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

4 Allocation dynamique
Dénition d'allocation dynamique
Avantages de l'allocation dynamique
Segment mémoire tas
Allocation dynamique en langage C
Allocation pour un pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 37 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Segment mémoire tas


L'allocation dynamique consiste à allouer un espace mémoire
de segment de tas (heap) durant l'exécution d'un programme.
La mémoire vive est divisée logiquement en quatre segments,
parmi lequel le segment de tas dont la taille est souvent
considéré comme illimitée, mais elle est en réalité limitée.
La mémoire allouée dans le segment tas doit être désallouée
explicitement.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 38 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Algorithmique
VAR ptr1 : ∧ entier, ptr2 : ∧ réel, ptr2∧ ←− 2,75
ptr3 : ∧ caractère ptr2+1∧ ←− 0,25
DÉBUT ptr3∧ ←− 'c'
ptr1 ←−allouer(2*entier) ptr3+1∧ ←− 'a'
ptr2 ←−allouer(2*réel) ptr3+2∧ ←− 'y'
ptr3 ←−allouer(3*caractère) libérer(ptr1)
ptr1∧ ←− 7 libérer(ptr2)
ptr1+1∧ ←− 11 libérer(ptr3)
FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 39 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

4 Allocation dynamique
Dénition d'allocation dynamique
Avantages de l'allocation dynamique
Segment mémoire tas
Allocation dynamique en langage C
Allocation pour un pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 40 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique en langage C

Fonctions d'allocation
Les fonctions pour la gestion dynamique de la mémoire sont
dénies dans un chier bibliothèque "<stdlib.h>"
void * malloc(sizeof(type)*taille) : permet de réserver un
ensemble des cases mémoire et retourne l'adresse de début de
cet espace. L'avantage est de créer des tableaux et structures
dynamiques.
void * calloc(taille,sizeof(type)) : permet de réserver un
ensemble des cases mémoire initialisées à zéro et retourne
l'adresse de début de cet espace.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 41 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Les fonctions prédénies d'allocation

Les fonctions d'allocation


void * realloc(pointeur, sizeof(type)*taille) : permet de
changer la taille d'un espace mémoire existant et retourne
l'adresse de début de cet espace.
void * free(pointeur) : permet de libérer un espace mémoire
réservé par les pointeurs.

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 42 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Programme C
#include <stdio.h> void remplir(short *A, short
#include <stdlib.h> T){
short * allouer(short *T){ short i ;
do{ printf("Donner la taille : ") ; for(i=0 ; i<T ; i++)
scanf("%hi",T) ; scanf("%hi",A+i) ;}
}while( *T<=2) ; int main( ) {
return short *tab = NULL, N ;
malloc(*T*sizeof(short)) ; } tab=allouer(&N) ;
remplir(tab,N) ;
free(tab) ;
return 0 ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 43 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

4 Allocation dynamique
Dénition d'allocation dynamique
Avantages de l'allocation dynamique
Segment mémoire tas
Allocation dynamique en langage C
Allocation pour un pointeur double

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 44 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Allocation de pointeur double


VAR ptr : ∧∧ entier ((ptr+i)∧ +j)∧ ←− 2+aléa(11)
DÉBUT FinPour
ptr ←−allouer(3*pointeurs) FinPour
Pour i de 0 à 2 pas←−1 faire Pour i de 0 à 2 pas←−1 faire
(ptr+i)∧ ←−allouer(2*entier) libérer((ptr+i)∧ )
FinPour FinPour
Pour i de 0 à 2 pas←−1 faire libérer(ptr)
Pour j de 0 à 1 pas←−1 faire FIN

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 45 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Programme C
#include <stdio.h> for(i=0 ; i<*L ; i++)
#include <stdlib.h> *(P+i) =
short ** allouer(short *L, malloc(*C*sizeof(short)) ;
short *C){ return P ;}
short **P, i ; void remplir(short **A, short
do{ printf("Donner deux L, short C){
dimensions : ") ; short i,j ;
scanf("%hi%hi",L,C) ; for(i=0 ; i<L ; i++)
} while( *L<=2 || *C<=2) ; for(j=0 ; j<C ; j++)
P=malloc(*L*sizeof(short *(*(A+i)+j) =
*)) ; 2+rand()%11 ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 46 / 47
Introduction Dénition d'allocation dynamique
Notion d'un pointeur Avantages de l'allocation dynamique
Relation entre Pointeur et tableau Segment mémoire tas
Allocation dynamique Allocation dynamique en langage C
Allocation pour un pointeur double

Allocation dynamique

Programme C
int main( ) {
short **mat = NULL, L,C,i ;
mat=allouer(&L,&C) ;
remplir(mat,L,C) ;
for(i=0 ; i<L ; i++)
free(*(mat+i)) ;
free(mat) ;
return 0 ;}

Hassen NAKBI :: Université de Sousse, ESSTHS Chapitre 1 : Les pointeurs 24 janvier 2023 47 / 47

Vous aimerez peut-être aussi