Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parDanette Perret Modifié depuis plus de 11 années
1
GEF 243B Programmation informatique appliquée
Modèle de mémoire et arithmétique de pointeurs §10.2
2
Revue Qu’est-ce que le masquage d’information?
Dans le langage C, quel fichier est l’interface du module? Pourquoi on l’appel interface? Software engineering concept that says that every module hides a secret from the other modules Header or .h file The functions that are listed in this file are the only ones that are available to outside modules JGA Beaulieu
3
Review Qu’est que cela va imprimer? #include <stdio.h>
EEE Memory Mlodel and Pointer Arithmetic Review Winter 2010 Qu’est que cela va imprimer? #include <stdio.h> void main (void) { int a[5]={22, 4, 61, 8, 2} int* p; int* r; p = &a[2] r = &a[4] if (*p > *r) printf(“Twiddle-dee”); else printf(“Twiddle-dum”); } 7. p points to the address of int 61 8. r points to the address of int 2 9. 61 > 4 is TRUE 10. Twiddle-dee gets printed JGA Beaulieu Sylvain P. Leblanc 3
4
Synopsis Modèle de mémoire pour un programme en C
Arithmétique de Pointeur JGA Beaulieu
5
Modèle de mémoire Un programme en C a quatre segments principaux:
Segment de code (votre programme) Données (static et globales) Le tas (mémoire dynamique) (heap) Pile (segment automatique) (stack) JGA Beaulieu
6
} Modèle de mémoire Pile Espace vide; la dernière frontière Tas
Show them how it grows and shrinks Not all schemes will look like this. The data may be in the middle between the stack & Heap. Perhaps the globals and statics are in separate places. What they need to understand is the general idea. Données Code JGA Beaulieu
7
Dude… où est ma Var? Memory model JGA Beaulieu
8
Modèle de mémoire Dude…Où est ma var? int i = 0; void main (void)
{ int j = 0; } int Fctn () int l = 0; static int k = 0; Stack Heap Data Code JGA Beaulieu
9
Modèle de mémoire Dude…Où est ma var? Stack Tas Données Code
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 The compiled code goes there Données Code JGA Beaulieu
10
Modèle de mémoire Dude…Dude…Où est ma var? Pile void main (void) {
int *iPtr; … iPtr = (int *)malloc(10 * sizeof(int)); } Tas Données Code Tell them that we will soon see dynamic memory allocation, but for the moment any memory that you ask for is given from the heap, it is there until you free it explicitly or until the program terminates. JGA Beaulieu
11
Example #include <stdio.h> int myGlobal=0; void main(void) {
char localString[]="TEST"; int *pInt; static int i=100; printf("Une adresse de pile : %d\n", localString); printf("Une autre adresse de pile: %d\n", &pInt); printf("Une adresse de texte : %d\n", "Hello"); printf("Adresse de var statique : %d\n", &i); printf("Adresse de var globale : %d\n", &myGlobal); getchar(); } JGA Beaulieu
12
Arithmétique de pointeur
Vous avez déjà vue ou même utilisé au moins une opération d’arithmétique de pointeur int *pInt = NULL; … pInt++; //Bouge mon ptr en avant de un En avant de un, mais un quoi? Bouge de un, mais un mouvement qui est égale au nombre d’octets du type. JGA Beaulieu
13
Arithmétique de pointeur
Les pointeurs ont des types parce qu’ils pointent à un type. Ceci est important quand on fait de l’arithmétique de pointeurs: int tblDeInts[5] = {1,2,3,4,5}; int *pInt = tblDeInts; … pInt++; //Ceci bouge mon pointeur en //avant de deux octets (assuming int is 16 bits) tblDeInts Chaque carré est un octet En mémoire @init Après pInt++ JGA Beaulieu
14
Arithmétique de pointeur
Et: char aOfChars[3] = {'a','b','c','d','e'}; char *pChar = aOfChars; … pChar++; //Ceci bouge le pointeur // de un octet en avant aOfChars Chaque carré est un octet En mémoire @init After pChar++ JGA Beaulieu
15
Arithmétique de pointeur
La même chose va pour tout les autres types de pointeurs! Si on pointe vers la définition de type structure ETUDIANT: ETUDIANT *ptrAEtud = unEtudiantCMR; … ptrAEtud++; //Ceci bouge le pointeur //vers l’avant de //sizeof(ETUDIANT) octets JGA Beaulieu
16
Arithmétique de pointeur
Il y a seulement quelques opérations arithmétiques 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 d’un 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 éléments) They should get that the number of positions here refers to the number of ints in this case or whatever the type may end up to be. Subtracting pointers of different types, even if performed in a cast, would be meaningless and silly! JGA Beaulieu
17
Arithmétique de pointeur
Vous ne pouvez pas additionner, multiplier ou diviser deux pointeurs (il n’y 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 idée. JGA Beaulieu
18
Quiz Time Quelle est la différence entre le tas et la pile pour les programmes? Avec le programme suivant répondez tas ou pile: //Un programme int i = 0; //où? void main (void) { int j = 0; // où? } int Fctn () static int k = 0;// où? int l = 0; // où? The heap is for memory that the programmer requests in the form of the memory allocation requests or by using the static keyword in front of a variable. Variables on the heap are there for the duration of the program or until the programmer asks for the memory to be freed. The stack allocation and reclaiming is automatic. JGA Beaulieu
19
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; //Qu’y a t-il //à tblDeInts[0]? The last question should result in -1. JGA Beaulieu
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.