Pointeurs
- Q1: Comment savoir qu'un littérale numérique est une adresse mémoire?
(Source Série Schaum)
Les littéraux numériques qui sont des adresses mémoire sont exprimés sous forme hexadécimale, de la façon
suivante: 0x18c5b4.
- Q2: Quelles sont les deux utilisations du symboles * en C++??
(Source Série Schaum)
Utilisé comme préfixe, le symbole * est un opérateur de déréférence. Utilisé comme suffixe, il désigne le
pointeur vers un type dérivé.
- Q3: Quel est le rôle de l'opérateur de déréférence?
(Source Série Schaum)
Appliqué à un pointeur, l'opérateur de déréférence renvoie l'objet vers lequel ce pointeur pointe.
- Q4: Sachant que:
int cercle_id;
int *cercle_id_adresse;
double rayon;
double *rayon_adresse;
Les expressions suivantes sont-elles correctes? Dites pourquoi.
(Source Orazio)
- Q5: Soient les déclarations C++ suivantes:
int a[5] = {1,2,3,4,5};
int* b;
double c[3] = {6,7,8};
double* d;
Les expressions suivantes sont-elles correctes? Dites pourquoi.
(Source Orazio)
- a.
b = a[0];
Le pointeur b doit prendre l'adresse de a[0] et non pas sa valeur i.e. b=&a[0];
- b.
cout << b+1 << endl;
Compilation ok. Mais attention lors de l'exécution de cette expression. Il faudra initialiser le pointeur avant
de le déréférencer.
- c.
b = &c[2];
c est un tableau de double alors que b est un pointeur sur des int => b=&a[2];.
- d.
d=FFEE;
Il faudra initialiser d avec l'adresse d'un élément du tableau et non pas une adresse "brute" qui correspond
à une variable "inconnue". Une solution possible d=&c[0];.
- e.
d=&c[3];
Pas d'erreur à la compilation, même si vous débordez du tableau => plantage à l'exécution. Solution
possible d=&c[2].
- Q6: Les déclarations suivantes sont-elles correctes? Dites pourquoi.
(Source Orazio)
- a.
delete array;
Correcte. La variable array peut-être un pointeur sur un seul élément.
- b.
new [8];
Incorrecte. Il faut préciser le type i.e. new int[8];
- c.
new double[8];
- d.
delete [10] array;
Incorrecte. On ne précise pas la taille du tableau dont la mémoire doit être libérée. Il fallait écrire:
delete [] array;
- e.
new[1] = 3;
Incorrecte. new n'est pas un tableau! Il fallait écrire: si array est un tableau, array[1] = 3;
- Q7: Les déclarations suivantes sont-elles correctes? Dites pourquoi.
(Source Orazio)
- a.
char *paa = "aa" "bb" "cc";
Correcte. Le pointeur paa est initialisé avec l'adresse d'une chaîne constante contenant "aabbcc".
- b.
char* pbb = "abc[3]";
Correcte. Le pointeur pbb est initialisé avec l'adresse d'une chaîne constante contenant "abc[3]".
- c.
char* pcc[3] = {"a","b","c[3]"};
Correcte. Le pointeur pcc[2] est par exemple est initialisé avec l'adresse d'une chaîne constante contenant "c[3]".
- d.
char* pdd[2] = {"aa" "bb" "cc"};
Correcte. Cependant seul le pointeur pda[0] est initialisé avec l'adresse d'une chaîne constante contenant "aabbcc".
- Q8: Expliquer la sortie obtenue suite à l'exécution du
programme suivant: demo5exo8.cpp.
[Solutionnaire].
- Q9: Écrire un programme qui permet de remplir un tableau à deux dimensions avec des valeurs entières (int) comprises entre 1 et 50.
Utiliser un pointeur pour afficher en sortie les valeurs stockées dans le tableau. L'affichage en sortie doit correspondre à ce qui suit:
[Solutionnaire].
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
- Q10: Soit les instructions suivantes:
char *p; // ligne -1-
const char *q; // ligne -2-
char &r; // ligne -3-
char t[10]; // ligne -4-
q = p; // ligne -5-
r = p; // ligne -6-
char &s = *p; // ligne -7-
p = &s; // ligne -8-
s = p; // ligne -9-
p = s; // ligne -10-
s = *p; // ligne -11-
*p = s; // ligne -12-
t = p; // ligne -13-
p = t; // ligne -14-
*t = *p; // ligne -15-
Indiquez, pour chacune des lignes précédentes: Lignes syntaxiquement correctes et lignes syntaxiquement incorrectes. Dans le cas des lignes incorrectes,
dites pourquoi ces lignes sont syntaxiquement incorrectes et corrigez-les.
Les lignes correctes: 1, 2, 4, 5, 7, 8, 11, 12
Les lignes incorrectes: 3, 6, 9, 10, 13.
Les corrections à apporter sont:
- ligne -3- une référence doit être toujours initialisée.
- ligne -6- on n'affecte pas un pointeur à un caractère.
- ligne -9- on n'affecte pas un pointeur à un caractère.
- ligne -10- on n'affecte pas un caractère à un pointeur.
- ligne -13- on ne peut pas modifier l'adresse du premier élément d'un tableau automatique.
- Q11: En supposant que:
Calculer l'adresse hexadécimale (en mémoire) et la valeur associée pour chacune des variables et cela après l'exécution du programme suivant: demo5exo11.cpp.
(Source Johnston)
int_ptr |
int_ptr |
float_ptr |
int |
int |
int |
int |
float |
float |
float_ptr |
g_ptr |
f_ptr |
b_ptr |
g |
f |
e |
d |
c |
b |
a |
xFF3C |
xFF40 |
xFF50 |
|
29 |
18 |
4 |
6.00000 |
0.000000 |
15.1000 |
xFF30 |
xFF34 |
xFF38 |
xFF3C |
xFF40 |
xFF44 |
xFF48 |
xFF4C |
xFF50 |
xFF54 |
Remarques: Nous avons ajouté un appel à showpoint pour forcer l'affichage
des nombres après la virgule dans le cas des variables float. Par contre, nous
n'avons associé aucune valeur pour g, car elle n'a pas été initialisée dans le
programme (le programme va affecter la valeur 0).
|
|