Vous êtes sur la page 1sur 19

GEF 243B Programmation informatique applique

Modle de mmoire et arithmtique de pointeurs 10.2

Revue
Quest-ce que le masquage dinformation? Dans le langage C, quel fichier est linterface du module? Pourquoi on lappel interface?

2-Apr-13

JGA Beaulieu

Review
Quest que cela va imprimer?
1. #include <stdio.h> 2. void main (void) 3. { 4. int a[5]={22, 4, 61, 8, 2}; 5. int* p; 6. int* r;

7. 8. 9. 10. 11. 12. 13. }


2-Apr-13

p = &a[2]; r = &a[4]; if (*p > *r) printf(Twiddle-dee); else printf(Twiddle-dum);


JGA Beaulieu 3

Synopsis
Modle de mmoire pour un programme en C Arithmtique de Pointeur

2-Apr-13

JGA Beaulieu

Modle de mmoire
Un programme en C a quatre segments principaux:
Segment de code (votre programme) Donnes (static et globales) Le tas (mmoire dynamique) (heap) Pile (segment automatique) (stack)

2-Apr-13

JGA Beaulieu

Modle de mmoire
Pile

}
Tas Donnes Code
2-Apr-13 JGA Beaulieu

Espace vide; la dernire frontire

Dude o est Memory model ma Var?

2-Apr-13

JGA Beaulieu

Modle de mmoire
DudeO est ma var?
int i = 0; void main (void) { int j = 0; } int Fctn () { int l = 0; static int k = 0; }
2-Apr-13 JGA Beaulieu

Stack

Heap

Data
Code
8

Modle de mmoire
DudeO est ma var?
int i = 0; void main (void) { int j = 0; j = j + 5; } int Fctn () { int l = 0; static int k = 0; k = k +10; }

Stack

Tas

Donnes
Code

2-Apr-13

JGA Beaulieu

Modle de mmoire
DudeDudeO est ma var?
void main (void) {
int* iPtr;

Pile

Tas
Donnes Code

iPtr = (int*)malloc(10 * sizeof(int));

}
2-Apr-13 JGA Beaulieu 10

Example
#include <stdio.h> int myGlobal=0; void main(void) { char localString[]="TEST"; int* pInt; static int i=100; printf("Une adresse de pile : printf("Une autre adresse de pile: printf("Une adresse de texte : printf("Adresse de var statique : printf("Adresse de var globale : getchar(); }
2-Apr-13 JGA Beaulieu 11

%d\n", %d\n", %d\n", %d\n", %d\n",

localString); &pInt); "Hello"); &i); &myGlobal);

Arithmtique de pointeur
Vous avez dj vue ou mme utilis au moins une opration darithmtique de pointeur
INT16U* pInt = NULL; pInt++; //Bouge mon ptr en avant de un

En avant de un, mais un quoi?

2-Apr-13

JGA Beaulieu

12

Arithmtique de pointeur
Les pointeurs ont des types parce quils pointent un type. Ceci est important quand on fait de larithmtique de pointeurs: INT16U tblDeInts[5] = {1,2,3,4,5}; INT16U* pInt = tblDeInts; pInt++; //Ceci bouge mon pointeur en //avant de deux octets tblDeInts
Chaque carr est un octet
@init
2-Apr-13

Aprs pInt++
JGA Beaulieu

En mmoire
13

Arithmtique de pointeur
Et:
char aOfChars[5] = {'a','b','c','d','e'}; char* pChar = aOfChars; pChar++; //Ceci bouge le pointeur // de un octet en avant

aOfChars
@init
2-Apr-13

After pChar++
JGA Beaulieu

Chaque carr est un octet


En mmoire
14

Arithmtique de pointeur
La mme chose va pour tout les autres types de pointeurs! Si on pointe vers la dfinition de type structure ETUDIANT:
ETUDIANT* ptrAEtud = unEtudiantCMR; ptrAEtud++; //Ceci bouge le pointeur //vers lavant de //sizeof(ETUDIANT) octets

2-Apr-13

JGA Beaulieu

15

Arithmtique de pointeur
Il y a seulement quelques oprations arithmtiques que vous pouvez faire sur les pointeurs :
int* pInt; Unary: ++pInt, --pInt Postfix: pInt++, pInt- Ajouter un index (un int) un pointeur: pInt + 5 (avance de 5 positions) Soustraction dun index: pInt 5 Soustraction de pointeurs: pInt1 pInt2
Donne le nombre de positions entre deux pointeurs utile pour calculer les offsets dans les tableaux (distance entre lments)
2-Apr-13 JGA Beaulieu

16

Arithmtique de pointeur
Vous ne pouvez pas additionner, multiplier ou diviser deux pointeurs (il ny a aucun point faire cela ):
Est-ce que quelque chose de bon pourrait en ressortir? Sans tre pointilleux on peut dire que ce ne serait point une bonne ide.

2-Apr-13

JGA Beaulieu

17

Quiz Time
Quelle est la diffrence entre le tas et la pile pour les programmes? Avec le programme suivant rpondez tas ou pile:
//Un programme int i = 0; void main (void) { int j = 0; } int Fctn () { static int k = int l = 0; }
2-Apr-13

//o?

// o?

0;// o? // o?

JGA Beaulieu

18

Quiz Time
Dessinez o les pointeurs sont dans le tableau:
int tblDeInts[5] = {1,2,3,4,5}; int* pInt = tblDeInts; int* pInt2 = NULL; pInt = pInt + 4; pInt2 = pInt--; tblDeInts[0] = pInt pInt2; //Quy a t-il // tblDeInts[0]?

2-Apr-13

JGA Beaulieu

19