26
GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

Embed Size (px)

Citation preview

Page 1: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

GEF 243BProgrammation informatique

appliquée

Pointeurs et adresses

§9.1

Page 2: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 2

Revue

• Qu’est-ce qu’un type dérivé?• Pourquoi est-ce que les tableaux sont des types

dérivés?• Quelles sont les trois caractéristiques d’un

tableau?• Que veut-on dire par passer par valeur et par

référence?

Page 3: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 3

Synopsis

• Adresses: symbolique, logique et physique• L’opérateur d’adresse - &• Pointeurs • Opérateur d’indirection *• Initialisation des pointeurs• Travailler avec les pointeurs et les adresses• Types de pointeurs

Page 4: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 4

Adresses

• Jusqu’à maintenant nous avons utilisés les variables pour identifier nos données dans nos programmes

• On assigne un identificateur (un symbole) à nos variables dans une déclaration, et ensuite nous utilisons ce nom pour manipuler les données

• Le compilateur utilise ces identificateurs pour résoudre la location symbolique d’une variable à une adresse

Page 5: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 5

Adresses

• Quand nous avons parlé des tableaux et fonctions, nous avons vue que de passer une variable par référence au lieu de par valeur peut être plus efficaceCeci est due au fait que la fonction peut avoir accès à

des données ‘extérieurs’ et de les modifier directement; sauvant le temps de système pour les appels de fonctions

• Cet accès direct aux variables a beaucoup plus d’utilités

Page 6: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 6

Adresses

• Adresses…mais les systèmes d’exploitation peuvent charger les programmes où ils le veulent dans la mémoire physique. Pour une exécution, la variable a peut être à l’adresse

physique 01A4:F4A1 et pour la prochaine exécution la même variable peut être à 34BC:4DA1

• Même si nous voulons la puissance de nous servir des adresses, nous ne voulons pas perdre la flexibilité que nous donnes les noms symboliques

Page 7: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 7

Adresses

• Et bien vous êtes chanceux, C nous permet de nous servir d’adresses symboliques en utilisant ce qui s’appel un pointeur.

• Mais avant d’aller plus loin, nous allons regarder un modèle de mémoire pour visualiser ce que sont ces genres de mémoires

Page 8: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 8

Adresses – modèle de mémoire

#define stuff…void main(){…int a;…}

0000Symbolique Logique Physique

00FF

…Compile

et link

chargement

Environment

Page 9: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 9

Adresses

• Le modèle que nous venons de voir peut être simplifié si nous comprenons qu’à partir de notre programme dans le monde symbolique (le code en C) nous pouvons obtenir une adresse durant l’exécution d’un programme

• Les adresses symboliques cachent les complications du système d’exploitation et du matériel d’adressagePub: si vous prenez le cours de systèmes d’exploitation

en 4ème année, vous allez voir la poussière sous le tapis

Page 10: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 10

Opérateur d’adresse (&)

• Alors où est-ce que ma variable crèche?• En utilisant l’opérateur d’adresse (&) en avant

d’une variable dans le code, nous pouvons obtenir sa location en mémoire

• Si maVariable dans mon programme est un char alors &maVariable est l’adresse logique de ce char

• Il ne faut pas oublier que c’est le hardware qui fait la conversion de logique à physique

• Donc nous avons la capacité d’obtenir une adresse; on veut aussi être capable de stocker et manipuler cette adresse

Page 11: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 11

Variables pointeurs

• En C nous avons des variables qui peuvent stocker des adresses d’ordinateur; ce sont des variables pointeurs ou pointeurs tout court

• Donc si j’utilise l’opérateur & et que j’obtiens l’adresse d’une variable, je peux affecter cette adresse à une variable pointeur

• Un pointeur est déclaré comme suit:int* pointeurAInt; //pointeur à int

char* ptrAChar; //pointeur à char

Page 12: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 12

Variables pointeurs

• Notez la similarité dans la façon de déclarer les pointeurs et les tableaux :int* pointeurAInt;

int tableauDeInts[];

• Donc les pointeurs sont des types dérivés tout comme les tableaux.

Page 13: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 13

Variables pointeurs

…void main(){…int a = 145;int* p; // un pointeur…p = &a; //prend l’adresse de a

//et met la dans le ptr p}

SymboliqueMémoire

145

12500

a

XX

p

46798

Page 14: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 14

Variables pointeurs

…void main(){…int a = 145;int* p; // un pointeur…p = &a; //prend l’adresse de a

//et met la dans le ptr p}

SymboliqueMémoire

145

12500

a

12500

p

46798

Page 15: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 15

Variables pointeurs

…void main(){…int a = 145;int* p; // un pointeur…p = &a; *p = 99; //indirection

}

SymboliqueMémoire

99

12500

a

12500

p

46798

*p

Page 16: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 16

Variables pointeurs

…void main(){…int a = 145;int b = 0;int* p; // un pointeur…p = &a; *p = 99; //indirectionb = *p; //b = valeur de la var

//pointée par p}//main

SymboliqueMémoire

99

12500

a

12500

p

4679899

57109

b

Page 17: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 17

Variables pointeurs - init

• Un pointeur, comme toutes les autres variables en C, n’a pas d’initialisation automatique Il contient des déchetsUne séquence de bits aléatoires

• Plus que n’importe quelles autres variables, vous devriez toujours initialiser vos pointeurs explicitement

• Vous pouvez initialiser vos pointeurs avec une adresse réelle: int a;int* p;p = &a;

Page 18: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 18

Variables pointeurs - init

• Ou utiliser le mot NULL (dans stddef.h)

int* p = NULL;• Si votre pointeur a une valeur NULL et que vous le

déréférencez, vous allez avoir une erreur d’exécution (run-time)

• Les pointeurs ambiguës ou qui sont mal initialisés sont une source majeure d’erreurs en C

• Une des choses les plus utiles que vous pouvez faire quand vous travailler avec des pointeurs est de dessiner votre logique de pointeurs

Page 19: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 19

Pointeurs - Avantages

• Les pointeurs nous permettent de passer les adresses de variables en paramètres aux fonctions

• Ils sont à la base de l’allocation dynamique de la mémoire en CNous permettent de grandir ou rapetisser les structures

de données si nous ne savons pas avant la compilation la grandeur des données

Utilisation efficace de la mémoire – Excellent pour les petits microcontrôleurs

• Les pointeurs nous permettent la manipulation efficace des données dans les tableaux

Page 20: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 20

Travailler avec les pointeurs et les adresses

int a = 6;int b = 10;int* p = NULL;int* r = NULL;p = &a; r = p; //pointe à la

//même variable b = *r;

Symbolique Mémoire

6

12500

a

12500

p

46798

6

57109

b

12500

32547

r

Page 21: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 21

Travailler avec les pointeurs et les adresses

int a = 6;int b = 10;int* p = NULL;int* r = NULL;p = &a; r = p; //pointe à la

//même variable b = *r; //b = ap = &b; //p pointe

//à b*p = 8; //change la

//valeur de b

Symbolique Mémoire

6

12500

a

57109

p

46798

8

57109

b

12500

32547

r

Page 22: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 22

Pointeurs - flexibilité

• Touts ces énoncés sont équivalents:

int a;

int* p = &a;

a = a + 1;

a++;

*p = *p + 1;

(*p)++; //notez les ()

a = *p + 1;

Page 23: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 23

Pointeurs - types

• Il est important de comprendre qu’un pointeur n’a pas seulement un type; mais que le pointeur pointe à une variable qui a un type particulier.

• Donc un pointeur prend les attributs du type auquel il pointe, en plus de ses attributs de pointeurCeci est parce que vous pouvez déréférencer un

pointeur et appliquer des opérations associées avec le type qui est pointé

Page 24: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 24

Pointeurs - types

• Donc vous ne pouvez pas mêler les types de pointeurs dans les énoncés:

int* p = NULL;char* r = NULL;…r = p; //erreur (avertissement)

• La seule exception à cette règle est le type de pointeur void (prochain cours)

Page 25: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 25

Quiz Time

int a = 1;int b = 2;int *p = NULL;int *r = NULL;…p = &b;r = &a;*r = *p; //quelles sont les

//valeurs de a et b?

Page 26: GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1

4/11/23 26

Devoir

int question;

int chapitre=9;char livre[]="Forouzan";

void main(void){  for(question=16; question<=20; question++)    RépondQuestion(livre, chapitre, question);}