Cours pointeurs-ed

Telechargé par jean-yves FARRAUDIERE
Les Pointeurs en C – C++
DERENDINGER Eric - 2013 1
Rappel
Pointeurs
&
DERENDINGER
Eric– 20131
&
Allocation de mémoire
Rappel
Les variables en mémoire
Adressage des variables
Notion de pointeurs
Pointeurs & Tableaux
Allocation dynamique de la mémoire
DERENDINGER
Eric– 20132
Une variable est destinée à contenir une valeur du
t
yp
e avec le
q
uel elle est déclarée.
yp q
Physiquement cette valeur se situe à une adresse de
la mémoire vive RAM (Random Access Memory).
Exemple : un entier nommé x
int
x;
// Réserve un emplacement pour un entier en mémoire
DERENDINGER
Eric– 20133
int
x;
//
Réserve
un
emplacement
pour
un
entier
en
mémoire
.
x = 10; // Écrit la valeur 10 dans l'emplacement réservé.
Espace Mémoire (8 bits de données)
Adresse mémoire
[0 - Taille de la RAM]
int x; x (réservation de 4 octets pour un int)
Contenu d’un octet en mémoire
DERENDINGER
Eric– 20134
x = 10; x (4 octets)
Les Pointeurs en C – C++
DERENDINGER Eric - 2013 2
Espace Mémoire (8 bits de données)
Adresse mémoire
[0 - Taille de la RAM]
unsigned char Tab[3]; Tab (réservation d’un tableau 3 octets non signés)
Contenu d’un octet en mémoire
Tab : adresse du tableau
V
ariable Tab
[
0
]
DERENDINGER
Eric– 20135
Tab[0] = 10; Tab (3 octets)
[]
En C – C++ , on dispose de deux mode d’adressage :
Ad di
d' ibl
Ad
ressage
di
rect :
A
cc
è
s au contenu
d'
une var
i
a
bl
e
par le nom de la variable.
Adressage indirect :
Accès au contenu d'une variable
par le biais de l'adresse de cette variable -> pointeur.
L’opérateur &permet de récupérer l’adresse d’une
variable :
DERENDINGER
Eric– 20136
&x est l’adresse de x ( 62 ).
x (réservation de 4 octets)
Définition : "
Un pointeur est une variable spéciale
qui contient l'adresse d'une autre variable.
"
Ch i t t
àt ddé
Ch
aque po
i
n
t
eur es
t
n
à
un
t
ype
d
e
d
onn
é
es.
Déclaration : <type> * nom_pointeur ;
!!! Il faut toujours initiliser le pointeur avec l’adresse
d’une variable ou réserver un emplacement mémoire
vide !!!
int
*
px;
DERENDINGER
Eric– 20137
int
px;
int *px; // Réserve un emplacement pour
stocker l’adresse mémoire d’un entier
px = &x; // affecte la valeur du pointeur
avec l'adresse mémoire de la variable x.
*px = 25; // affecte la valeur 25 à l'adresse
mémoire contenue dans px.
DERENDINGER
Eric– 20138
Les Pointeurs en C – C++
DERENDINGER Eric - 2013 3
int *px;
px = &x;
DERENDINGER
Eric– 20139
px pointe sur x
L’opérateur * permet d’accéder au contenu de la
variable pointée :
variable
pointée
:
*px = 20; // Maintenant x est égal à 20.
20
DERENDINGER
Eric– 201310
Après les instructions: <type> a;
<t
yp
e> *
p;
yp p;
p = &a;
p : pointe sur a
p : désigne &a (adresse de a)
*p : désigne a (valeur ou contenu de a)
DERENDINGER
Eric– 201311
La déclaration d’un pointeur (adresse d’une variable)
ne permet pas de connaître la taille de la variable
(exemple les variables de type tableaux ou les objets
en C++)
Allocation dynamique de taille mémoire pour la
variable
DERENDINGER
Eric– 201312
La réservation de la mémoire doit absolument se faire
pendant l'exécution du programme
!
Les Pointeurs en C – C++
DERENDINGER Eric - 2013 4
La fonction malloc
() ( #include
<stdlib.h>
)
void malloc( <N> ) fournit l'adresse d'un bloc en mémoire de
<N> octets libres ou la valeur zéro (NULL
)s
'
il
n
'
yapas
<N>
octets
libres
ou
la
valeur
zéro
(NULL
)
sil
ny
a
pas
assez de mémoire.
La fonction sizeof
()
sizeof (<type>) fournit la taille en octets pour une variable ou
un objet du type <type>
L’opérateur en C++ new
nomClasse *nomObjet ; // déclare un pointeur
nomObjet du type de la classe nomClasse.
Obj
Cl
()
// é l’
DERENDINGER
Eric– 201313
nom
Obj
et = new mon
Cl
asse
()
;
//
r
é
serve
l’
espace
mémoire pour cet objet de la taille de la classe nomClasse()
en octets.
int nbr[25];
int *p;
T
aille en octets
Type de pointeur
(Casting)
Il est toujours utile de tester si l’allocation a eu lieu
:
p = (int *) malloc(25*sizeof(int)); // réservation
d’un espace mémoire de 25 entiers
p = nbr // affectation de l’adresse du tableau
d’entier nbr à p
(Casting)
DERENDINGER
Eric– 201314
if (p == NULL) printf ("Impossible d’alloué l’espace mémoire ");
La fonction free()
(
<stdlib.h>
)
free
(
Pointeur
)
;
(
)
libère le bloc de mémoire (déjà alloué) désigné par
le Pointeur .
Si nous ne libérons pas explicitement la mémoire à
l'aide free(), alors elle est libérée automatiquement
à la fin du programme.
DERENDINGER
Eric– 201315
à
la
fin
du
programme.
#include <stdio.h>
#include <stdlib.h>
main()
#include <stdio.h>
#include <stdlib.h>
main()
Adressage Direct Adressage Indirect
{
// Variables à adressage
direct
int i;
int tab[10] ;
// affectation des valeurs au
tableau
for(i=0; i<10; i++)
tab[i]=i;
// Affichage des valeurs du
{ int i, nbr[10];
// Variables pointeur à adressage
indirecte
int * p;
p=(int*)malloc(10*sizeof(int));
p = nbr;
// affectation des valeurs au
t
ableau
DERENDINGER
Eric– 201316
//
Affichage
des
valeurs
du
tableau
for(i=0; i<10; i++)
printf("%d\n",tab[i]);
}
f
or(i=0
;
i<10; i++)
nbr[i]=i;
// Affichage des valeurs du tableau
for(i=0; i<10; i++)
printf("%d\n",p[i]);
free(p);
}
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !