Académique Documents
Professionnel Documents
Culture Documents
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;
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
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
}
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
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
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
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