J'essaie de comprendre comment l'initialisation d'un pointeur à un objet de structure (qui contient un pointeur sur une structure du même type) se produit. E.g j'ai un suppose que j'ai l'adresse de départ d'un pool de mémoire I.e piscine est un pointeur à l'emplacement de départ. (Pour des arguments, disons que la mémoire de départ est maintenant je déclare un pointeur de type actuellement maintenant ce qui se passe est que Je ne comprends pas pourquoi l'adresse du ps: j'ai essayé de trouver comment cela se produit mais ne pouvait pas trouver la documentation correspondante. Si ce type de question est déjà répondu dans une documentation ou une autre question, veuillez fournir un lien. P> PPS: Après avoir discuté de ce problème avec ma collègue, j'ai découvert que < img src = "https://i.stack.imgur.com/vtgnr.png" alt = "Entrez la description de l'image ici"> p> p> struct code>:
1001 code>.) P>
noeud code> > et attribuez-lui la mémoire de départ via
reterpret_cast code>. p>
a code> pointe vers la mémoire
1001 < / code>. Maintenant, je déclare un autre pointeur p>
b code> pointe vers la même adresse que
a code> ie
1001 code>. Le pointeur
B-> Suivant code> pointe vers un emplacement aléatoire attendu, mais l'adresse du pointeur
b-> suivant code> est identique à l'adresse à laquelle
b code> est pointant IE
1001 code>. Ie p>
b-> suivant code> est identique à celle de laquelle le pointeur
b < / code> est pointé? Selon ma compréhension
B-> Suivant code> doit être localisée où
B code> est situé. P>
B code > est un pointeur et non un objet. Il pointe vers un emplacement (c.-à-d.
1001 code>) où selon
B code> un objet de nœud existe qui contient le pointeur
suivant code> et donc l'adresse de < Code> B-> Suivant code> (
& B-> Suivant code>) est identique à celui de l'emplacement sur lequel
B code> pointe. p>
3 Réponses :
C'est une exigence de C ++ (rembourrage de la mémoire modulo): le premier membre d'une structure est situé à la même adresse que la structure elle-même. P>
pour la comparaison, Vous pouvez le voir comme une matrice, dans la chaîne p>
(le Le Par exemple, si la question est, où est la chaîne Vous diriez que Remarque: Comme mentionné par Nathanolivier, ceci n'est valable que pour Types de mise en page standard forts>. p> abcd code> p>
A code> est pris à des fins pratiques, ce n'est pas le même que le
a code> dans votre question) p>
A code> est situé au même emplacement que la chaîne
abcd code>.
La chaîne est votre structure et chaque lettre est un champ.
A code> peut être
nœud :: Suivant code>. Le terme "pointant vers une structure" est un synonyme de "pointant vers le premier octet de la structure donnée". P>
abcd code> dans cette séquence: p>
1234ABCD56789 code> p>
4 code> parce que c'est où le premier élément em> de la chaîne est. C'est juste la même chose, dans la plupart des cas, avec C ++. Et
A code> est également situé dans la position
4 code>. P>
Le premier membre d'une structure pointe dans la même adresse que la structure elle-même. I> Ceci n'est garanti que pour les types de mise en page standard.
permet de dire que je déclare un pointeur de type nœud et attribuez-lui une mémoire de départ (E.G 1001) P> blockQuote>
Pour l'argument, je vais prétendre que ce code compile, que vous pouvez attribuer directement un entier arbitraire à un pointeur sans
REINIERPRET_CAST CODE>. P>.
A code> est maintenant ce que c ++ appelle un "pointeur non valide". C'est un pointeur, mais cela ne souligne rien. P>
Que se passe-t-il est que "B" pointe vers la même adresse que "A" I.E 1001. P> blockQuote>
c'est correct.
B code> est maintenant aussi invalide que
A code>. p>
Le pointeur "B-> Suivant" P> blockQuote>
Nope. Si vous déroute un pointeur invalide, vous obtenez un comportement indéfini.
B code> ne pointe pas réellement un objet
noeud code>, il n'y a donc aucun
B-> Suivant code> Pointeur. Donc, parler de la valeur d'un
B-> Suivant code> Pointeur qui n'existe pas n'a pas de sens. P>
L'adresse du pointeur "B-> Suivant" est identique à celle de laquelle B est dirigé I.e 1001. P> blockQuote>
Cela ressemble à ce que vous parlez réellement est la mise en page du noeud de struct
code>. Le fait que, étant donné un objet de type
nœud code>, l'adresse de cet objet et l'adresse de son premier membre de données sera la même. Puisque
nœud code> est la mise en page standard, qui sera vraie. P>
Mais il est important de noter que l'adresse du premier membre de données n'est pas l'adresse que
suivant code> points sur em>. C'est l'adresse de
suivant code> elle-même em>. Un objet pointeur un objet, tout comme n'importe quel autre objet, il a donc un stockage en mémoire. Par conséquent, vous pouvez obtenir un pointeur à un pointeur em>. C'est ce pointeur sur le pointeur
suivant code> qui aura la même adresse que le nœud code> objet code> il vit dans, pas la valeur em> du
Suivant code> Pointeur lui-même. P>
C'est-à-dire, dans un exemple hypothétiquement valide, l'adresse de
B code> et
& b-> suivante code> serait la même. p>
permet de prendre les locaux de base, mais avec un exemple valide à la place:
+---+ | a | --\ +---+ \ +-----------------+ >--> | the node object | +---+ / +-----------------+ | b | --/ +---+
C'est rationnel: Si A = B, F (A) = F (B).
"pourrait différer" -> "pourrait sembler différer"
noeud * A = 1001; code> ne compilera pas.
Puisque vous avez utilisé la balise C ++ 17 spécifiquement, j'ai supprimé la balise C. C et C ++ sont des langues différentes et la réponse peut dépendre de cela. Si vous souhaitez poser des questions sur C, veuillez modifier les balises C ++ à une balise C.
Pourquoi l'adresse de
B-> Suivant code> est-elle différente de celle à laquelle
b code> pointe-t-il? Où autre serait
B-> Suivant code> être situé, à votre avis? Le fait que les deux sont de type
nœud * code> n'est pas pertinent. Envisager:
struct s {int n;}; S s; STD :: COUT << ((VOID *) & S == (VOID *) & S.N); CODE> Ceci imprimera
1 code>
Essayer des choses aléatoires n'est pas un bon moyen d'apprendre C ++.
Le pointeur est dur et un long sujet. Je suggère de passer à travers le (s) Cahpter (s) d'un Good C ++ Book sur les pointeurs et ensuite voir si cela répond à votre question. Un autre bit d'informations nécessaire est que pour les types de mise en page standard (quel nœud est), l'adresse de la classe est la même que l'adresse du premier membre.