Title: GEF 243B Programmation informatique applique
1GEF 243BProgrammation informatique appliquée
2Revue
- Quest-ce quun type dérivé?
- Pourquoi est-ce que les tableaux sont des types
dérivés? - Quelles sont les trois caractéristiques dun
tableau? - Que veut-on dire par passer par valeur et par
référence?
3Synopsis
- Adresses symbolique, logique et physique
- Lopérateur dadresse -
- Pointeurs
- Opérateur dindirection
- Initialisation des pointeurs
- Travailler avec les pointeurs et les adresses
4Adresses
- 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 dune variable à
une adresse
5Adresses
- 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
efficace - Ceci 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
dutilités
6Adresses
- Adressesmais les systèmes dexploitation peuvent
charger les programmes où ils le veulent dans la
mémoire physique. - Pour une exécution, la variable a peut être à
ladresse physique 01A4F4A1 et pour la prochaine
exécution la même variable peut être à 34BC4DA1 - 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
7Adresses
- Et bien vous êtes chanceux, C nous permet de nous
servir dadresses symboliques en utilisant ce qui
sappel un pointeur. - Mais avant daller plus loin, nous allons
regarder un modèle de mémoire pour visualiser ce
que sont ces genres de mémoires
8Adresses modèle de mémoire
Platform
Logique
Physique
Symbolique
0000
define stuff void main() int a
00FF
Compile et link
chargement
9Adresses
- 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
lexécution dun programme - Les adresses symboliques cachent les
complications du système dexploitation et du
matériel dadressage - Pub si vous prenez le cours de systèmes
dexploitation en 4ème année, vous allez voir la
poussière sous le tapis
10Opérateur dadresse ()
- Alors où est-ce que ma variable crèche?
- En utilisant lopérateur dadresse () en avant
dune variable dans le code, nous pouvons obtenir
sa location en mémoire - Si maVariable dans mon programme est un char
alors maVariable est ladresse logique de ce
char - Il ne faut pas oublier que cest le hardware qui
fait la conversion de logique à physique - Donc nous avons la capacité dobtenir une
adresse on veut aussi être capable de stocker et
manipuler cette adresse
11Variables pointeurs
- En C nous avons des variables qui peuvent stocker
des adresses dordinateur ce sont des variables
pointeurs ou pointeurs tout court - Donc si jutilise lopérateur et que jobtiens
ladresse dune variable, je peux affecter cette
adresse à une variable pointeur - Un pointeur est déclaré comme suit
- int pointeurAInt //pointeur à int
- char ptrAChar //pointeur à char
12Variables 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.
13Variables pointeurs
Symbolique
Physique
void main() int a 145 int p // un
pointeur p a //prend ladresse de a //et
met la dans le ptr p
14Variables pointeurs
Symbolique
Physique
void main() int a 145 int p // un
pointeur p a //prend ladresse de a //et
met la dans le ptr p
p
12500
46798
15Variables pointeurs
Symbolique
Physique
void main() int a 145 int p // un
pointeur p a p99 //indirection
a
99
12500
p
p
12500
46798
16Variables pointeurs
Symbolique
Physique
void main() int a 145 int b 0 int p
// un pointeur p a p99 //indirection b
p //b valeur de la var //pointée par
p //main
a
99
12500
p
b
12500
99
46798
57109
17Variables pointeurs - init
- Un pointeur, comme toutes les autres variables en
C, na pas dinitialisation automatique - Il contient des déchets
- Une séquence de bits aléatoires
- Plus que nimporte 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
18Variables 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
dexécution (run-time) - Les pointeurs ambiguës ou qui sont mal
initialisés sont une source majeure derreurs 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
19Pointeurs - Avantages
- Les pointeurs nous permettent de passer les
adresses de variables en paramètres aux fonctions - Ils sont à la base de lallocation dynamique de
la mémoire en C - Nous 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
20Travailler avec les pointeurs et les adresses
Symbolique
Physique
int a 6 int b 10 int p NULL int r
NULL p a r p //pointe à la //même
variable b r
a
6
12500
r
12500
32547
p
b
6
12500
57109
46798
21Travailler avec les pointeurs et les adresses
Symbolique
Physique
int a 6 int b 10 int p NULL int r
NULL p a r p //pointe à la //même
variable b r //b a p b //p pointe
//à b p 8 //change la //valeur de b
a
6
12500
r
12500
32547
p
b
8
57109
57109
46798
22Pointeurs - 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
23Pointeurs - types
- Il est important de comprendre quun pointeur na
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
pointeur - Ceci est parce que vous pouvez déréférencer un
pointeur et appliquer des opérations associées
avec le type qui est pointé
24Pointeurs - 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)
25Quiz 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?
26Devoir
- int question
- int chapitre9char livre"Forouzan"
- void main(void) for(question16
questionlt20 question) RépondQuestion(livre
, chapitre, question) -