Mon opinion personnelle est que les photos avec des flèches pointant de cette façon, ou qui font des pointeurs plus difficile à comprendre. Il les rend semblent comme abstraite, des entités mystérieuses. Ils ne le sont pas.
Comme tout le reste dans votre ordinateur, les pointeurs sont des nombres. Le nom de "pointeur" est juste une façon élégante de dire "une variable contenant une adresse".
Par conséquent, permettez-moi de remuer les choses autour de en expliquant comment un ordinateur fonctionne réellement.
Nous avons une int
, il a le nom d' i
et la valeur 5. C'est stockée dans la mémoire. Comme tout ce qui est stocké dans la mémoire, il a besoin d'une adresse, ou nous ne serions pas en mesure de le trouver. Disons i
se termine à l'adresse 0x12345678 et son copain j
de la valeur 6 se termine juste après. En supposant un PROCESSEUR 32 bits où l'int est de 4 octets, et les pointeurs sont de 4 octets, alors les variables sont stockées dans la mémoire physique comme ceci:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
Maintenant, nous voulons souligner à ces variables. Nous avons créer un pointeur de type int, int* ip1
, et un int* ip2
. Comme tout dans l'ordinateur, ces variables de pointeur obtenir alloué quelque part dans la mémoire. Supposons qu'ils finissent à la prochaine adjacentes adresses dans la mémoire, immédiatement après l' j
. Nous avons mis les pointeurs pour contenir les adresses des variables précédemment alloué: ip1=&i;
("copier l'adresse de i dans ip1") et ip2=&j
. Ce qui se passe entre les lignes est de:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
Donc, ce que nous avons été tout de suite à 4 octets morceaux de mémoire contenant des nombres. Il n'y a pas de mystique ou magique flèches de nulle part en vue.
En fait, juste en regardant un vidage de la mémoire, nous ne pouvons pas dire si l'adresse 0x12345680 contient un int
ou int*
. La différence est la façon dont notre programme choisit d'utiliser le contenu stockée à cette adresse. (La tâche de notre programme est en fait juste de dire à la CPU de quoi faire avec ces chiffres.)
Ensuite, nous ajoutons encore un autre niveau d'indirection avec int** ipp = &ip1;
. De nouveau, nous venons de passer une partie de la mémoire:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
Le modèle ne semblent familiers. Encore un autre bloc de 4 octets contenant un nombre.
Maintenant, si nous avions un vidage de la mémoire de la ci-dessus fictif peu de RAM, nous avons pu vérifier manuellement où ces pointeurs point. Nous coup d'oeil à ce qui est stocké à l'adresse de l' ipp
variable et de trouver le contenu 0x12345680. Ce qui est bien sûr l'adresse où ip1
est stocké. Nous pouvons aller à cette adresse, vérifiez le contenu de là, et de trouver l'adresse d' i
, puis, enfin, nous pouvons aller à cette adresse et de trouver le numéro 5.
Donc, si nous prenons le contenu de l'ipp, *ipp
, nous allons obtenir l'adresse du pointeur de la variable ip1
. En écrivant *ipp=ip2
nous copier ip2 en ip1, il est équivalent à ip1=ip2
. Dans les deux cas, nous aurions
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(Ces exemples ont été donnés pour un big endian CPU)