Académique Documents
Professionnel Documents
Culture Documents
I‐ Les pointeurs
Mise en situation
1- Les variables et emplacements mémoire
2- Les méthodes d’accès au contenu d'une variable
a) L’adressage direct
b) L’adressage indirect
3- Les pointeurs
a) La déclaration d’un pointeur
b) Le référencement de variables / le déréférencement de pointeurs
i. Le référencement d’une variable
ii. Le déréférencement d’un pointeur
I‐ Les pointeurs
Mise en situation :
Dans la programmation, nous utilisons des variables pour stocker des
informations. le compilateur assure la gestion de la mémoire en affectant
à chaque variable un emplacement déterminé. (La mémoire RAM de
l'ordinateur est vue comme un long tableau continu.).
9
1‐ Les variables et emplacements mémoire
a) L’adressage direct
L’adressage direct c’est l’accès au contenu d'une variable par le nom de la variable.
Exemple :
int A= 10 ;
b) L’adressage indirect
L’adressage indirect ‘c’est l’Accès au contenu d'une variable en passant par l'adresse de la
variable.
Exemple :
int A= 10 ;
Application :
scanf() : on utilise l’adresses des variables pour éviter toutes confusion. (Variables locales
vs. Variables globales).
10
3‐ Les pointeurs
Soit A et P deux variables (deux espaces mémoires) :.
A contenant une valeur (par exemple 10)
P contient l'adresse mémoire (héxadicimal / int) de A.
Un pointeur est une variable qui permet de stocker l’adresse mémoire d’une autre
variable.
Exemple :
Attention :
La déclaration d'un pointeur alloue un espace mémoire pour le pointeur
mais pas pour la variable pointée.
11
Information :
Exemple :
Information :
Exemple :
Exercice :
int a;
int* p;
p=&a;
12
Solution :
*p et a correspondent au même emplacement mémoire
p et a ont donc la même valeur.
int A ;
int * P ;
P = &A
A désigne le contenu de A
&A désigne l’adresse de A
P désigne l’adresse de A
*P désigne le contenu de A
En outre &P désigne l’adresse du pointeur P (peu utilisé)
*A n’a pas de sens, puisque A n’est pas un pointeur.
Objectif / intérêts :
Les arguments d'une fonction sont des variables locales qui sont utilisées
lors de son appel. On a intérêt que les modifications effectuées sur des
variables à l’intérieur d’une fonction ont également effets en dehors de la
fonction.
13
1‐ Le passage par valeur
Exécution :
Résultat :
X=3 et Y=4.
X et Y restent inchangés !
14
Explication :
Lors de l'appel, les valeurs de X et de Y sont copiées dans les paramètres A et B.
PERMUTER échange bien contenu des variables locales A et B, mais les valeurs de X et
Y restent les mêmes.
A retenir :
- Dans un passage par valeur, juste une copie de la variable est transmise à la fonction.
- Dans un passage par valeur, les modifications effectuées à l’intérieur de la fonction
n’ont pas d’effets en dehors de la fonction.
Besoin :
Garder les modifications des contenus des variables en dehors des fonctions ou elles sont
modifiées.
15
Nous appelons la fonction par :
X=3 ;
Y=4 ;
PERMUTER(&X, &Y);
Exécution :
Résultat :
Explication :
16
Ce qui il faut retenir :
- Dans un passage par référence, l’adresse de la variable elle-même est transmise à la
fonction.
- Dans un passage par référence, les modifications effectuées à l’intérieur d’une
fonction ont également effets en dehors de la fonction.
Conclusion :
Si vous souhaitez ne transmettre que la valeur du variable utilisez le «Passage par valeur»
et si vous souhaitez voir la modification de la valeur originale du variable, utilisez le
«Passage par référence».
17
III‐ L’allocation de la mémoire
Mise en situation :
Architecture de la mémoire :
La mémoire RAM est découpée en deux zones Heap (Le tas) et Stack (ou
La pile) qui ont chacune leur leur fonctionnement et leur utilisation.
la pile : Pour des variables relativement petites qui ne doivent persister que tant que la
fonction qui les utilise est active.
le tas : Pour des gros bloc de mémoire (un grand tableau ou une grande structure pouvant
changer de taille) et que vous devez conserver cette variable pendant une longue période
(comme une variable globale).
18
1) L’allocation automatique/statique de la mémoire
Se fait automatiquement par le compilateur : Lorsque vous déclarez une variable à l’aide
d’un type de données de base, le compilateur alloue automatiquement de l’espace
mémoire pour la variable dans la zone mémoire « Stack »
Objectif / intérêts :
▶ Définir de « grosses » structures de données dont la taille n’est connue
qu'à l’exécution.
Exemple : Tableaux de dimensions variables, listes chaînées.
▶ Libérer l'espace mémoire alloué lorsqu’il n'est plus nécessaire.
Etapes
▶ l'allocation de la mémoire, réalisée par la fonction : malloc
…. sizeof pour calculer l’espace mémoire nécessaire
▶ la libération de la mémoire, réalisée par la fonction free ;
Rappel : La déclaration d'un pointeur alloue un espace mémoire pour le pointeur mais
pas pour l'objet pointé.
Syntaxe :
type_var* ptr;
ptr = malloc( nb_octes );
Exemple :
19
L'opérateur sizeof (taille en octets)
L’opérateur sizeof() sert à calculer le nombre d'octets occupés par une variable :
Syntaxe :
Donc malloc() peut réserver le nombre d'octets nécessaires pour nb_var variables de
type type_var comme suit :
Syntaxe :
type_var* ptr;
ptr = malloc( sizeof(type_var) * nb_var );
Syntaxe :
nom‐du‐pointeur = malloc( ) ;
….
free(nom‐du‐pointeur);
Remarque :
Si nous ne libérons pas la mémoire à l'aide free(), alors elle ne sera libérée
automatiquement qu’à la fin du programme.
Information :
Les fonctions de gestion dynamique de la mémoire se trouvent dans :
bibliothèque standard du C
#include <stdlib.h>
20
c) Autres fonction de l’allocation de la mémoire
i. La fonction calloc()
Après modification
21
Exemple : allocation dynamique de la mémoire
Exécution :
22