Title: Pointeurs et adresses
1Pointeurs et adresses
2Intérêt des pointeurs
- Manipulation directe de la mémoire
- Programmes compacts et efficaces
- Un moyen, pour une fonction appelée, de manipuler
des variables de la fonction appelante
3Les adresses (1)
- Un tableau de cases mémoire (octets) consécutives
numérotées (adressées) que lon peut manipuler
individuellement ou par groupe de cases
contiguës. - Une adresse est codée sur un ou deux octets.
Pointeur_int
0000 0000
0001 0010
0000 0000 0001 0100
0000 0000 0001 0011
0000 0000 0001 0010
0000 0000 0001 0001
0000 0000 0000 0001
0000 0000 0000 0010
0000 0000 0000 0011
4Les adresses (2)
- La déclaration int i 10 se traduit par
- La réservation dun espace mémoire (4 octets
consécutifs) pour y stocker un entier, puis - Association du nom i à cette zone.
- Ladresse du premier octet de cette zone est
i. - Rappel Lecture dun entier scanf(d, i)
5Les pointeurs
- Un pointeur est simplement une variable qui
contient une adresse mémoire. - Cest en fait
- Un nom
- Un type dobjet pointé
- Une valeur (une adresse codée sur 1, 2 ou 4
octets). - Le type pointeur nexiste pas, il faut connaître
le type de lobjet pointé. - char p
- int p_int
- struct nud k, p_k
- int pp_int
6Affectation des pointeurs
int p,q,i3 p3 / provoque erreur!/
pi qp
7Affectation des pointeurs(2)
int i,p,q
pi
qp
p
23
i
3
adresse
p3
adresse
q
Un pointeur est une adresse, la seule constante
que lon peut lui affecter est 0 (NULL)
8Mathématiques de pointeurs
- Pourquoi le type de lobjet pointé est il précisé
à la déclaration du pointeur? - Il est possible deffectuer des additions (et des
soustractions) sur les pointeurs - pp1 p-- ptN
- Les valeurs ajoutées sont converties en multiples
de la taille de lobjet pointé! - Exemple
- char p
- p /équivaut à calculer adresseadresse1sizeo
f(char)/ - Attention p_i , p_i , (p_i) ,
p_i
9Retour sur les tableaux
- int tab10
- Associe au nom tab ladresse du début de zone
alloué. - tab est équivalent à tab0
- En fait, tab est un pointeur sur le premier octet
du tableau - tab est équivalent à tab0
10Parcours dun tableau
- On peut donc parcourir un tableau grâce aux
pointeurs - short tab5
- tab est donc équivalent à tab0
- (tab3) est équivalent à tab3
- Mise à zéro des éléments dun pointeur
- int t100, p
- for(i0i?100i) ti0
- for(p t0 p ? p100 p) p0
- for(p t p ? t100 p) p0
- for(p t p ? t100 (p)0)
11Les pointeurs de caractères
- Une constante de type chaîne
- je suis une chaîne
- Est un tableau de caractères.
- j,e, ,s,u,i,s, , n,e,\0
- On y accède par des pointeurs.
- Attention à la différence
- char mess un message
- char p_mess un message
- On peut changer les caractères
- de mess, mais pas de la chaîne
- pointé par p_mess
un message\0
mess
p_mess
un message\0
12Tableaux multidimensionnels
- Un tableau bidimensionnel est un tableau de
tableaux de dimensions identiques. - int tNbLiNbCol
- Réservation de NbLi tableaux de NbColsizeof(int)
octets chacun - Association des noms t0, t1,aux adresses de
début des tableaux monodimensionnels - Association du nom t à ladresse de début du
tableau des NbLI tableaux monodimensionnels - Donc t2 est un tableau de NbCol.
t
t0
t1
tNBLIS-2
tNBLIS-1
13Tableaux multidimensionnels et pointeurs
- Initialisation
- short t54 0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11 - Accès
- it24 correspond à
- i ( t2 4)
- i ( ( t 2 ) 4)
- i ( t 2NBCOLS 4 )
14Tableaux de pointeurs
- char nom incorek, jan, fev,
mar, , sep, oct, nov, dec - Les pointeurs sont des variables peuvent être
contenues dans des tableaux - Taille variable
- Plus souple
- Gains de place et de vitesse
defghi
defghi
jklmnoparst
jklmnopqrst
abc
abc
15Allocation de mémoire(Statique)
- Lors de la déclaration de tableaux
- Les dimensions des tableaux doivent être connu à
la compilation. - Impossible int fonc(int a)
- int taa2
-
- Possible define N 10
- int tN100
16Allocation de mémoire(Dynamique)
- Gérée par le programmeur
- Demande despace malloc(), calloc()
- Manipulation du pointeur indiquant lespace
- Libération de lespace free()
- void malloc(unsigned size) (inclure stdlib.h)
- typedef struct noeud int val nud suivant
- nud liste
- liste (noeud ) malloc( (unsigned)
sizeof(noeud) ) - Toujours tester!
- if(p_point NULL) exit(1)
- Toujours libérer!
- free(p_point)
17Allocation de mémoire dynamique (2)
- char malloc(unsigned size)
- char calloc(unsigned size)
- char realloc(char p, unsigned size)
- void free(char p)
18Erreurs courantes
- Ne pas mélanger les 2 types de mémoire
- int tab10, p
- tab est interdit
- tab malloc() aussi
- tab p également.
- Attention, ne pas utiliser de pointeurs sur des
espaces libérés! (sauf pour laffecter à une
nouvelle zone mémoire)
19Erreurs courantes(2)
- Référence à un bloc non alloué
- int a
- int i a
- Référence à la valeur dun pointeur non
initialisé - int a (int) malloc(sizeof(int))
- int i a
- Référence à un pointeur sur une variable libérée
- int i
- int a (int) malloc(sizeof(int))
- free(a)
- I a
- Libèrer un pointeur non alloué.
- int a
- free(a)
20Erreurs courantes(3)
- Libérer une variable allouée statiquement
- int a10
- free(a)
- Désallouer deux fois le même pointeur
- free(a)
- free(a)
- Oublier de libérer la mémoire allouée
- int main(void)
- int a (int)malloc(sizeof(int))
-
- Déclarer un pointeur sur une variable locale
- int a, i
-
- int b
- a b
-
- ia
21Quelles sont les valeurs des variables aux
différentes étapes de ce programme?
- int main(void)
- int t2
- int a, b c
- t03
- t15
- a10
- bt
- ca
- cb
- a
- b
- b 2a
-
22Quel est le résultat du programme suivant?
- int main(void)
- char x10 0123456789
- char pa, pb
- pa x
- pb pa 3
- printf(s \npb)
-
23Quelles sont les valeurs des variables après
lexécution du programme suivant?
- int f(int x, int y, int z)
- x x y
- y y x
- z x - y
- return z
-
- int main(void)
- int a5, b9, c, d, e
- c e
- c 23
- d f(a, b , c)
-
24Pointeurs et tableaux
- Ecrivez la procédure strcat qui concatène la
chaîne t à la chaîne s, passées en paramètre. - En utilisant la notation tableau
- En utilisant des pointeurs
25Notation tableau
- void strcat(char s, char t)
- int i,j
- ij0
- while (si ! \0)
- i
- while ((si tj) ! \0)
-
26Notation pointeur
- void strcat(char s, char t)
- while(s)
- s
- while(s t)
-
-
27(No Transcript)