UdMHaut
UdMBAS

IFT1166
Programmation Orientée Objet avec C++

Département d'informatique et de recherche opérationnelle

Direction de l'enseignement de service en informatique
 

Image C++
 
Automne 2005

Accueil

Professeurs et
Démonstrateurs

Horaires et locaux

Notes de cours

Cours
après Cours

Démonstrations
et devoirs

Examens

Liens utiles

Au sujet du
livre de cours

Consultez vos notes

Foire aux questions
(FAQ)

Sessions antérieures

  Démonstration #5 Solutionnaire  
 
Dernière mise à jour : dim 09 oct 2005 12:21:07 EDT
 

Buts:

  • [Pointeurs].

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)

    • a.
      cercle_id = FFF3;
      
        La variable cercle_id est du type int, elle est initialisée avec une valeur incorrecte. Une façon de l'initialiser correctement cercle_id=2223.

    • b.
      cercle_id_adresse = FFF3;
      
        Le pointeur cercle_id_adresse doit contenir l'adresse de cercle_id i.e. cercle_id_adresse=&cercle_id.

    • c.
      cercle_id_adresse = rayon_adresse;
      
        Le pointeur cercle_id_adresse doit contenir l'adresse de cercle_id et non pas l'adresse de rayon i.e. cercle_id_adresse=&cercle_id.

    • d.
      rayon_adresse = *rayon;
      
        La variable rayon n'est pas un pointeur, il fallait écrire ce qui suit rayon_adresse = &rayon.

    • e.
      rayon = *rayon_adresse;
      
        Compilation ok. Mais attention lors de l'exécution de cette expression. Il faudra initialiser le pointeur avant de le déréférencer.

  • 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];
      
        Correcte.

    • 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:

    • a. Les pointeurs, les variables du type int et float sont tous codés sur 4 octets.

    • b. La variable g_ptr se trouve à l'adresse xFF30.

    • c. Les variables sont ordonnées dans cet ordre:
      g_ptr f_ptr b_ptr g f e d c b a
      

    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).




pift1166@iro.umontreal.ca
[top]