GEF 243B Programmation informatique appliquée Expressions logiques §5.1.
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses.
-
Upload
benjamin-guichard -
Category
Documents
-
view
109 -
download
1
Transcript of Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Pointeurs et adresses.
Hiver 2010 JGA Beaulieu
GEF 243BProgrammation 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?
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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;
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
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
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
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
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;
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é
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)
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?
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);}