Exercice langage C: Introduction aux pointeurs

1. Le programme ci-dessous illustre le fonctionnement des pointeurs en affichant les différentes valeurs contenues dans les variables.

Lisez-le en essayant de le comprendre. Essayez de déduire quelles vont être les valeurs affichées par les instructions cout.

 

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
#include 
 
using namespace std;
 
int main(int argc, char **argv) {
  int i = 9;
 
  cout  "Contenu de i: '"  i  "'"  endl;
  cout  "Adresse de i: '"  (unsigned int)&i  "'"  endl  endl;
 
  /* On declare un pointeur sur int et on lui
   * affecte l'adresse de i. On dit que p 
   * pointe sur i. */
  int *p = &i;
 
  cout  "Contenu de p: '"  (unsigned int)p  "'"  endl;
  cout  "Adresse de p: '"  (unsigned int)&p  "'"  endl;
  cout  "Contenu de la variable pointee par p: '"  *p  "'"  endl  endl;
 
  // On affecte 10 a l'adresse pointee par p.
  *p = 10;
 
  cout  "Contenu de la variable pointee par p: '"  *p  "'"  endl;
  cout  "Contenu de i: '"  i  "'"  endl;
 
  // Partie a completer
 
 
 
  // Fin de la partie a completer
 
  return 0;
}

2. Recopiez le programme donné dans emacs, compilez-le et lancez-le. Est-ce que les résultats affichés correspondent à ce que vous aviez prévu au point précédent?



Remarque: les adresses en mémoire sont toujours affichées sous forme hexadécimale (base 16). Pour les voir sous forme décimale, il faut les convertir en unsigned int, comme dans l'exemple ci-dessus.

3. Complétez le programme en incrémentant la variable i de 10 (i = i + 10), sans avoir recours directement à la variable i (utilisez un pointeur). Affichez ensuite la valeur de i pour vérifier que l'opération s'est bien déroulée.

4. Déclarez un nouveau pointeur sur int que vous nommerez q. Faites pointer q sur i. A nouveau, faites-le sans utiliser directement la variable i. Affichez le contenu du pointeur q pour vérifier votre code.

5. Déclarez une variable f de type float. Initialisez-la à $5$. Echangez ensuite son contenu avec celui de i, sans avoir recours à la variable i. Affichez les valeurs de i et f.

6. Déclarez une nouvelle variable j de type int que vous initialisez à 8. Faites pointer q sur j. Maintenant, échangez les valeurs de i et j sans utiliser ni i, ni j.

Affichez finalement les valeurs de i et j.


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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include 
 
using namespace std;
 
int main(int argc, char **argv) {
  int i = 9;
 
  cout  "Contenu de i: '"  i  "'"  endl;
  cout  "Adresse de i: '"  (unsigned int)&i  "'"  endl  endl;
 
  /* On declare un pointeur sur int et on lui
   * affecte l'adresse de i. On dit que p 
   * pointe sur i. */
  int *p = &i;
 
  cout  "Contenu de p: '"  (unsigned int)p  "'"  endl;
  cout  "Adresse de p: '"  (unsigned int)&p  "'"  endl;
  cout  "Contenu de la variable pointee par p: '"  *p  "'"  endl  endl;
 
  // On affecte 10 a l'adresse pointee par p.
  *p = 10;
 
  cout  "Contenu de la variable pointee par p: '"  *p  "'"  endl;
  cout  "Contenu de i: '"  i  "'"  endl;
 
  // Partie a completer
 
  // 3.  i incrementee de 10
  cout  "3."  endl;
  *p = *p + 10;
  cout  "Contenu de i: '"  i  "'"  endl;
 
  // 4.  nouveau pointeur sur i
  cout  "4."  endl;
  int *q = p;
  cout  "Contenu de la variable pointee par q: '"  *q  "'"  endl;
 
  // 5.  echange
  cout  "5."  endl;
  float f = 5;
 
  int t = *p;
  *p = int(f);
  f = t;
 
  cout  "Contenu de i: '"  i  "'"  endl;
  cout  "Contenu de f: '"  f  "'"  endl;
 
  // 6.  echange (2)
  cout  "6."  endl;
  int j = 8;
  q = &j;
 
  int k = *q;
  *q = *p;
  *p = k;
 
  cout  "Contenu de i: '"  i  "'"  endl;
  cout  "Contenu de j: '"  j  "'"  endl;
 
  // Fin de la partie a completer
 
  return 0;
}