Peut un pointeur jamais pointer vers lui-même?
Ma question est: Si un pointeur de variable a la même adresse que sa valeur, est-il vraiment pointant vers lui-même?
Par exemple - dans le morceau de code suivant, est a
un pointeur à lui-même?
#include<stdio.h>
int main(){
int* a;
int b = (int)&a;
a = b;
printf("address of a = %d\n", &a);
printf(" value of a = %d\n", a);
}
Si a
n'est pas un pointeur à lui-même, puis la même question se pose à nouveau: Peut un pointeur pointe vers lui-même?
Aussi, comment un auto pointage pointeur utile?
- Oui. __________
- ppl, pourquoi le negvotes? trop facile pour vous??
- Mon question est... - un "doute" est tout autre chose.
- Même si il est légal, je me demande ce que le compilateur ne fait lorsqu'il rencontre quelque chose comme ça. Puisque le compilateur met en quelques optimisation de son propre, je serais prêt à parier qu'il le prend. Mais, je ne pouvais pas dire à coup sûr.
- Vous pouvez avoir un pointeur vers un int stocker son propre emplacement de mémoire au lieu de stocker l'emplacement d'un int, si c'est ce que tu veux dire.
- J'ai trouvé cette question quand j'essayais de comprendre Obj C contexte vide pointeurs, comme dans "observeValueForKeyPath:(NSString *)chemin d'accès clé ofObject:(id)modification de l'objet:(NSDictionary *)changement de contexte:(void *)contexte". Le pointeur lui-même a été utilisé pour créer un cadre unique, qui je le comprends maintenant, à cause de cette question et la réponse. Merci.
- Possible, mais ce qui est le point ?
- Voici un lien à cette question: stackoverflow.com/questions/2532102/...
- Ne pas 2d+ tableaux le faire pour eux-mêmes de toute façon? Pour chaque "niveau" le tableau est imbriqué, vous devez déférence que beaucoup de fois pour arriver à la première valeur réelle, et le long de la façon dont elle renvoie la même adresse (À la première valeur), jusqu'à ce que vous y arrivez. Qui au moins se lit comme c'est un pointeur pointant sur lui-même, à plusieurs reprises. Ou... c'est Que c'est le pseudo de les éliminer de l'indice des itérateurs. Je suppose que c'est une question d'interprétation. Il semble vraiment inutile si vous le faites vous même, mais je suppose qu'il a une place quelque part.
- Ce que vous avez besoin est un pointeur vers votre propre commentaire.
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites réellement, il est pas avoir le pointeur pointe vers lui-même. Vous êtes à l'aide de l'espace mémoire alloué pour le pointeur pour stocker l'emplacement du pointeur de la. Un pointeur vers un int points à ints - jamais à d'autres pointeurs vers des entiers, y compris lui-même.
Par exemple, disons que vous créer un pointeur
a
:Il obtient sa propre place dans la mémoire:
Dans cet exemple simple, disons que a est à l'emplacement de la mémoire '5'.
Si vous étiez pour ce faire:
...la suite arrivera:
Ce qui se passe ici est que
a
vers ce qu'il pense est un entier au lieu de 5. Cela se passe aussi pour être le même emplacement mémoire que&a
pointe, mais dans le contexte de cea
pointe, il est maintenant de pointage à l'entier au lieu de 5 et de ce nombre entier est 5.Par exemple à la fois de ces travaux:
Si vous vouliez créer un pointeur vers un, vous avez très certainement pu - l'une de ces façons:
ou
Mais il est très important de réaliser que
a
n'est pas un pointeur à lui-même. C'est un pointeur vers la entier à l'emplacement des magasins de - qui se trouve être la même que celle de son propre emplacement.À plus de montrer (par un moyen encore plus simple exemple) ce qu'il se passe quelque chose de semblable pourrait se produire avec une
int
. Qui est, vous pouvez stocker la mémoire de l'emplacement d'unint
à l'intérieur de lui-même:a
a maintenant un emplacement dans la mémoire, et a une valeur de 999 (nous allons faire semblant il a été placé dans l'emplacement de mémoire '46'):C'est dans l'emplacement '46" - si nous le voulions, nous pourrions stocker ce nombre par un nombre entier à l'intérieur de
a
:et maintenant
a
est égal à&a
en valeur, mais pas dans le type -a
est juste un entier, il n'a pas de point à lui-même comme par magie maintenant, juste parce que nous l'avons utilisé pour stocker son propre emplacement de mémoire.a
ne pointe pas vers lui-même, puisque son contenu est une mémoire d'adresses (définition d'un pointeur, n'est-ce pas?) -dans ce cas, sa propre adresse, et non d'un nombre entier (il a été castée pour unint*
). Alors, évidemment,&a
eta
produire le même résultat lors de l'impression, dire0xABCD
. Mais maintenant, je peux légalement écrire*a = 0x1234
, etcout << a
montre que le pointeur déréférencé,a
a été modifié le :&a = 0xABCD
maisa = 0x1234
. Je me trompe quelque part?int *a;
,a
doit être dirigée vers unint
mais aprèsa=(int*)&a;
la variablea
serait pointant vers unint *
qu'il ne faut pas faire. (Pour mémoire, le type de&a
estint **
) Car les pointeurs sont traités comme des entiers (au moins d'habitude et peut-être dictée par les normes C, je ne sais pas), les choses fonctionnent, mais il n'a pas besoin d'être le cas dans une langue ou de l'architecture qui a traité des pointeurs différemment à partir de nombres entiers.Il n'est pas très utile, mais les structures qui pointent vers eux-mêmes sont utiles dans la circulaire des listes de longueur 1:
Par votre exemple précis, je crois que vous vouliez dire:
&a == &a.next
.&
de plus 🙂L'adresse mémoire à
FFFFFFFF
pouvez stocker la valeurFFFFFFFF
Bien, d'abord, je voudrais modifier le code autour de:
Je ne suis pas sûr de savoir pourquoi vous voulez faire cela, mais il est permis.
Ils doivent imprimer la même chose.
Noter que ce n'est pas une bonne idée, en tant que tout premier casting
a = (int **)&a
est un hack de la forcea
pour contenir une valeur qui ne devrait pas tenir. Vous déclarez unint **
mais essayer de forcer unint ***
en elle. Techniquement, les tailles sont les mêmes, mais, en général, ne pas le faire parce que les gens attendent qu'uneint *
contient l'adresse de quelque chose qui peut être utilisé comme unint
, une sorte de suite.Oui et non, parce que le pointeur est de type presque aussi important que la valeur du pointeur.
Oui, un pointeur peut contenir la position d'un pointeur à lui-même; encore un long peut contenir la position d'un pointeur à lui-même. (Ints, habituellement, mais je ne sais pas si c'est garantie partout.)
Cependant, il n'y a pas de type pour représenter cette relation. Si vous avez un pointeur qui pointe vers lui-même, vous avez réellement un type différent lorsque vous déréférencement d'elle. Donc:
Je dirais que la réponse est "non", car il ne fonctionnera pas, sauf si vous allez pour abus de ce type de système. Je pense que c'est une indication que vous êtes en train de faire quelque chose de mal (bien que parfois il est certainement nécessaire).
Déréférencement d'un pointeur de résultat une valeur de son type de valeur (par exemple, de déréférencer un
int*
vous donne unint
, unint*
s valeur type). Pour une variable pour pointer vers un pointeur de son type de valeur devrait êtreint*
, ce qui n'est pas le cas pour unint*
comme indiqué précédemment. Donc, pour un pointeur sur lui-même, il faudrait faire une sorte de casting pour l'obtenir par le compilateur:Déréférencer
a
, alors, vous avez uneint
dont la valeur se trouve être l'adresse à laquellea
est situé (mod troncature de l'adresse pour s'adapter à la nature), mais il est encore uneint
et pas unint*
, qui aurait besoin d'une autre fonte.Un pointeur vers un pointeur est souvent connu comme un poignée, qui est un autre type (
int**
) qu'un pointeur (int*
). (Notez qu'uneint**
poignée a une valeur de typeint*
.)Oui, un pointeur peut pointer vers lui-même comme mentionné dans les réponses.
Un possible cas d'utilisation, nous pouvons utiliser cette astuce, au lieu de pointeurs NULL. Vous pouvez initialiser int * p = (int *)&p, et de vérifier plus tard pour voir si le pointeur est valide ou pas. Cela aurait pu être utilisé si dire dans un système où nous voulions 0x0 et de l'ensemble de la plage d'adresses pour les adresses valides.
Vous pouvez également utiliser cette astuce dans la spéciale des programmes en C qui ne serait pas de crash sur pointeur NULL utilisation que parce que vous ne les éviter et de déréférencement système ne va pas planter. Cela conduira à des erreurs de comportement, mais il peut aider au débogage dans certaines situations.
Oui, il est possible de pointer vers lui-même.
Mais pas tout utiliser, au moins explicitement comme ça.
a
qui est un int* est un comportement indéfini (bien moins que si vous essayez d'utiliser le pointeur.Juste:
Il pointe vers lui-même.