Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Tableaux et pointeurs §10.1
2 Hiver 2010JGA Beaulieu Revue EchangeInts(int* premierInt, int* secondInt); int a = 8; int b = 7; … EchangeInts(?a,?b);//quel symbole remplace ? … EchangeInts(int* premierInt, int* secondInt) { int temp; temp = ?premierInt; //quel symbole remplace ? ?premierInt = ?secondInt; ?secondInt = temp; return; }
3 Hiver 2010JGA Beaulieu Synopsis Tableaux et pointeurs Variables et adresses Pointeurs constants Similarités entre les tableaux et les pointeurs
4 Hiver 2010JGA 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
5 Hiver 2010JGA 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 Pointeurs 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
6 Hiver 2010JGA Beaulieu Variables et adresses … void main() { … int a = 145; int *p = NULL; // un pointeur … p = &a; //met ladresse de a //dans le pointeur p. } Symbolique Mémoire a p 46798
7 Hiver 2010JGA Beaulieu … void main() { … int a = 145; int *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
8 Hiver 2010JGA Beaulieu … void main() { … int a = 145; int *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
9 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a = 145; int *p = NULL; int 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]
10 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a = 145; int *p = NULL; int 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]
11 Hiver 2010JGA Beaulieu Pointeurs 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
12 Hiver 2010JGA Beaulieu Pointeurs 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]);
13 Hiver 2010JGA Beaulieu Pointeurs 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
14 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a[3] = {1,7,9}; int *p = a; //On remarque que a //est une adresse int *r = &a[1]; … } Symbolique Mémoire 1 a 79 a[0]a[1]a[2] 984 p r 46800
15 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a[3] = {1,7,9}; int *p = a; int *r = &a[1]; … *p = 12; //Ceci est familier } Symbolique Mémoire 12 a 79 a[0]a[1]a[2] 984 p r 46800
16 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a[3] = {1,7,9}; int *p = a; int *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
17 Hiver 2010JGA Beaulieu Pointeurs constants … void main() { … int a[3] = {1,7,9}; int *p = a; int *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
18 Hiver 2010JGA Beaulieu Quiz Time … void main() { … int a[3] = {1,7,9}; int *p = NULL; int *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