26
Hiver 2010 JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Embed Size (px)

Citation preview

Page 1: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

GEF 243BProgrammation informatique

appliquée

Pointeurs et adresses

Page 2: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

Adresses – modèle de mémoire

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

0000Symbolique Logique Physique

00FF

…Compile

et link

chargement

Environment

Page 9: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses

Hiver 2010 JGA Beaulieu

Devoir

int question;

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

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