Blog de Robert Sebille


Vers mon curriculum vitae - Conception

Accueil > Technique > C/C++ > Langage C : Explorer les pointeurs de pointeurs.

Langage C : Explorer les pointeurs de pointeurs.

dimanche 20 juillet 2014, par Robert

Ceci est une petite réflexion personnelle suite à mon suivi du (remarquablement pédagogique) cours « Apprenez à programmer en C ! » de Mathieu Nebra sur Openclassroom (ex site du zero). Il est important de maîtriser au moins la partie de ce cours sur les pointeurs pour comprendre ce qui suit.

Notez bien, si vous testez :

  1. Les adresses des variables et pointeurs sera certainement différentes chez vous.
  2. « printf(’%ld’, &variable) ; » renvoie un décimal, tandis que « printf(’%p’, variable) renvoie un hexadécimal, voici un petit convertisseur en ligne qui vous facilitera l’interprétation.
  3. « printf(’%ld’, *pointeur) ; » risque de vous renvoyer un avertissement du type (« warning : format ’%ld’ expects type ’long int’, but argument 2 has type ’long int *’ ») ce qui n’est pas fatal à l’exécution du code.
  4. Le nombre décimal de l’adresse sur mon ordinateur est trop grand pour un « int », et j’utilise donc ici des « long int » . On utilisera donc « printf(’valeurld& %ld,\n’, &variable) ; » plutôt que « printf(’valeurd& %d,\n’, &variable) ; »

Code 1 Pointeur

Code :

#include <stdio.h>

int main (int argc, const char * argv[]) {
        //int variable = 20;
        long int variable = 20;
        long int *pSurVariable = &variable;

        printf('variable: valeurd %ld, adressep& %p\n', variable, &variable);
        printf('pSurVariable: valeurld %ld adressep& %p\n', pSurVariable, &pSurVariable);

        return 0;
}

Résultat :


variable : valeurd 20, adressep& 0x7fff5fbff678
pSurVariable : valeurld 140734799804024 adressep 0x7fff5fbff670

Tableau :

Note : 140734799804024 = 0x7fff5fbff678 -> OK

commande affichageadressevaleur
’%ld, %p’, variable, &variable 0x7fff5fbff678
(= 140734799804024)
20
’%ld, %p’, pSurVariable, &pSurVariable 0x7fff5fbff670 140734799804024
(= 0x7fff5fbff678)

Code 2 Pointeur de pointeur

Code :

        long int variable = 20;
        long int *pSurVariable = &variable;
        // On ajoute au code un pointeur de pointeur
        long int **pSurpSurVariable = &pSurVariable;

        printf('variable: valeurd %ld, adressep& %p\n', variable, &variable);
        printf('pSurVariable: valeurld %ld adressep& %p\n', pSurVariable, &pSurVariable);
        // On ajoute cette instruction printf
        printf('pSurpSurVariable: valeurld %ld adressep&; %p\n', pSurpSurVariable, &pSurpSurVariable);

Résultat :


variable : valeurd 20, adressep& 0x7fff5fbff678
pSurVariable : valeurld 140734799804024 adressep& 0x7fff5fbff670
pSurpSurVariable : valeurld 140734799804016 adressep& 0x7fff5fbff668

Note : 140734799804024 = 0x7fff5fbff678 et 140734799804016 = 0x7fff5fbff670 -> OK

Tableau :

commande affichageadressevaleur
’%ld, %p’, variable, &variable 0x7fff5fbff678
(=140734799804024)
20
’%ld, %p’, pSurVariable, &pSurVariable 0x7fff5fbff670
(=140734799804016)
140734799804024
(= 0x7fff5fbff678)
’%ld, %p’, pSurpSurVariable, &pSurpSurVariable 0x7fff5fbff668 140734799804016
(= 0x7fff5fbff670)

Code 3 on explore un peu

code :

        // On ajoute au code ces instruction printf
        printf('**pSurpSurVariableld %ld, *pSurVariableld %ld, variableld %ld \n', **pSurpSurVariable, *pSurVariable, variable);
        printf('*pSurpSurVariableld %ld, pSurVariableld %ld, &variableld %ld \n', *pSurpSurVariable, pSurVariable, &variable);
        printf('&**pSurpSurVariableld %ld, &*pSurVariableld %ld, &variableld %ld \n', &**pSurpSurVariable, &*pSurVariable, &variable);

Résultat supplémentaire :


**pSurpSurVariableld 20, *pSurVariableld 20, &variableld 20
*pSurpSurVariableld 140734799804024, pSurVariableld 140734799804024, &variableld 140734799804024
&**pSurpSurVariableld 140734799804024, &*pSurVariableld140734799804024, &variableld 140734799804024

Conclusion :

**pSurpSurVariable = *pSurVariable = variable = valeur de variable : 20
*pSurpSurVariable = &**pSurpSurVariable = pSurVariable = &*pSurVariable = &variable = adresse de variable : 140734799804024 (= 0x7fff5fbff678)

Tableau final :

commande affichageadressevaleur
’%ld, %p’, variable, &variable 0x7fff5fbff678
(=140734799804024)
20
’%ld, %p’, pSurVariable, &pSurVariable 0x7fff5fbff670
(=140734799804016)
140734799804024
(= 0x7fff5fbff678)
’%ld, %p’, pSurpSurVariable, &pSurpSurVariable 0x7fff5fbff668 140734799804016
(= 0x7fff5fbff670)
Adresse : *pSurpSurVariable = &**pSurpSurVariable = pSurVariable = &*pSurVariable = &variable
Valeur : **pSurpSurVariable = *pSurVariable = variable
0x7fff5fbff678
(=140734799804024)
20

Ah, on s’est bien amusé ! A quoi ça sert ? Voici 2 liens - entre autres- que j’ai trouvé pour avoir mal à la tête. Préparez le café ! ;-) :