Accueil > Technique > Informatique > C/C++ > Langage C : Explorer les pointeurs de pointeurs.
Langage C : Explorer les pointeurs de pointeurs.
dimanche 20 juillet 2014, par
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 :
- Les adresses des variables et pointeurs sera certainement différentes chez vous.
- « 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.
- « 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.
- 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 affichage | adresse | valeur |
---|---|---|
’%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 affichage | adresse | valeur |
---|---|---|
’%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 affichage | adresse | valeur |
---|---|---|
’%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é ! ;-) :