GEF 243B Programmation informatique appliquée Tableaux et pointeurs §10.1
21-Jan-14 2 JGA Beaulieu Revue EchangeInts(INT16U* premierInt, INT16U* secondInt); INT16U a = 8; INT16U b = 7; … EchangeInts(?a,?b);//quel symbole remplace ? … EchangeInts(INT16U* premierInt, INT16U* secondInt) { INT16U temp; temp = ?premierInt; //quel symbole remplace ? ?premierInt = ?secondInt; ?secondInt = temp; return; }
21-Jan-14 3 JGA Beaulieu Synopsis Tableaux et pointeurs Variables et adresses Pointeurs constants Similarités entre les tableaux et les pointeurs
21-Jan-14 4 JGA Beaulieu Tableaux et pointeurs Les tableaux et les pointeurs sont reliés de très près. Il est important de connaître les similarités et les différences entre les pointeurs et les tableaux Aujourdhui nous revisitons certains concepts qui sont importants pour la compréhension de la relation entre les tableaux et les pointeurs
21-Jan-14 5 JGA Beaulieu Variables et adresses Quand nous parlons des variables, nous devons faire une distinction entre la valeur dune variable et son adresse Pour une exécution donnée dun programme, une variable va garder la même adresse (logique) mais sa valeur peut changer PoINT16Ueurs et variables La valeur du pointeur, qui est une adresse peut changer durant lexécution dun programme Ladresse (logique) dune variable pointeur cependant est constante
21-Jan-14 6 JGA Beaulieu Variables et adresses … void main() { … INT16U a = 145; INT16U *p = NULL; // un pointeur … p = &a; //met ladresse de a //dans le pointeur p. } Symbolique Mémoire a p 46798
21-Jan-14 7 JGA Beaulieu … void main() { … INT16U a = 145; INT16U *p = NULL; // un pointeur … p = &a; //met ladresse de a //dans le pointeur p. } Variables et adresses Symbolique Mémoire a p Ce sont des constantes
21-Jan-14 8 JGA Beaulieu … void main() { … INT16U a = 145; INT16U *p = NULL; // un pointeur … p = &a; //met ladresse de a //dans le pointeur p. } Variables et adresses Symbolique Mémoire a p Le contenue est variable
21-Jan-14 9 JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a = 145; INT16U *p = NULL; INT16U scores[3] = {1,7,9}; … p = &a; scores[0] = a;//Bon p = scores; //Bon, voir à côté scores = p; //Pas légal } Symbolique Mémoire a p scores 79 scores[2]
21-Jan JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a = 145; INT16U *p = NULL; INT16U scores[3] = {1,7,9}; … p = &a; scores[0] = a;//Bon p = scores; //Bon, voir à côté scores = p; //Pas légal } Symbolique Mémoire a 984 p Cest une constante scores 79 scores[2]
21-Jan JGA Beaulieu PoINT16Ueurs constants On se souvient que un tableau a trois caractéristiques : un nom, un nombre fixe déléments et un type Le nom du tableau est une constante; cest ladresse qui pointe au premier octet du tableau. La prochaine diapo peut sembler un peu bizarre mais si vous pensez à scores comme un pointeur constant le tout devient plus évident
21-Jan JGA Beaulieu PoINT16Ueurs constants Tout ces énoncés impriment la même valeur: printf("Valeur de scores - une constante %d\n", scores); printf("Adresse du tableau scores %d\n",&scores); printf("Adresse du premier élément %d\n",&scores[0]);
21-Jan JGA Beaulieu PoINT16Ueurs constants Les similarités entre les tableaux et les pointeurs nous permettent daccéder les données dans un tableau de deux façons différentes: en utilisant un index ou un pointeur Nous pouvons aussi utiliser un index sur un pointeur pour référer aux éléments dans le tableau Nous pouvons déréférencer le nom du tableau, comme un pointeur Et encore plus!!! Rorouzan chap 11 a bien plus dexemples
21-Jan JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a[3] = {1,7,9}; INT16U* p = a; //On remarque que a //est une adresse INT16U* r = &a[1]; … } Symbolique Mémoire 1 a 79 a[0]a[1]a[2] 984 p r 46800
21-Jan JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a[3] = {1,7,9}; INT16U *p = a; INT16U *r = &a[1]; … *p = 12; //Ceci est familier } Symbolique Mémoire 12 a 79 a[0]a[1]a[2] 984 p r 46800
21-Jan JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a[3] = {1,7,9}; INT16U *p = a; INT16U *r = &a[1]; … *p = 12; //Ceci est familier *a = 543;//Regardez! On déréférence //un tableau } Symbolique Mémoire 543 a 79 a[0]a[1]a[2] 984 p r 46800
21-Jan JGA Beaulieu PoINT16Ueurs constants … void main() { … INT16U a[3] = {1,7,9}; INT16U *p = a; INT16U *r = &a[1]; … *p = 12; //Ceci est familier *a = 543; //déréférence un tableau r[0] = 66; //un pointeur indexé r[-1] = 77; r[1] = 111; } Symbolique Mémoire 77 a a[0]a[1]a[2] 984 p r 46800
21-Jan JGA Beaulieu Quiz Time … void main() { … INT16U a[3] = {1,7,9}; INT16U *p = NULL; INT16U *r = NULL; … r = &a[1]; //dessinez les pointeurs p = &a[2]; //remplissez les boites *p = 8; //changez les valeurs p[-2] = r[0]; //écrivez la valeur } Symbolique Mémoire 1 a 79 a[0]a[1]a[2] p r 46800