8
votes

C postes question

pour: xxx

a est une adresse dans laquelle un entier peut être stocké. & a est une adresse où A est stocké. Ensuite, où est & a stocké? Et où est & (& a) stocké? Et, où est & (& (& a)) stocké? Où cette stockage d'adresses s'arrête-t-elle?


4 commentaires

Un entier ne peut pas être stocké là-bas jusqu'à ce que vous allouiez une certaine mémoire ou attribuer l'adresse d'une mémoire valide à un


Si vous recherchez vraiment comment les pointeurs sont stockés, consultez cette réponse à: Stackoverflow.com/Questtions/991075/...


Ici aussi: Stackoverflow.com/Questions/96285/...


Il y a une excellente explication des pointeurs ici: Stackoverflow.com/questions/5727


14 Réponses :


4
votes

& a est une constante.

& (& a) est illégal.


8 commentaires

constante dans cette portée = p


& a n'est pas vraiment une constante. La variable pourrait être sur la pile. Il est calculé en runtime.


C'est une rvalue (c'est-à-dire ce que vous mettriez sur le côté droit d'un opérateur d'affectation), et donc une constante en ce qui concerne le programme. Le fait que cela puisse avoir différentes valeurs sur différentes pistes est hors de propos.


Strictement parlant, & A est une valeur temporaire et donc une valeur R, et vous ne pouvez pas prendre l'adresse d'une rvalue. Vous pouvez appeler cela "une constante" ou "un éléphant" comme vous voulez, de toute façon vous ne parlez pas la langue de la norme.


"Constant" en anglais sens, non dans le C89 const / littéral sens.


& a, c'est comme le résultat d'un appel de la fonction. C'est juste une valeur. Aucun objet impliqué et aucun changement autorisé (évidemment, une valeur ne peut pas être modifiée! Un objet peut être modifié qui produira ultérieurement une valeur différente lors de la lecture).


& a n'est pas constant. La valeur changera chaque fois que le code contenant et a est appelé. Encore une fois, défini au moment de l'exécution. C'est l'emplacement de la mémoire du pointeur à un entier.


& A est constant en ce qui concerne le fait que vous ne pouvez pas lui attribuer. Ceci est comme un argument constant à une fonction. Bien qu'il change de valeur chaque fois que vous le voyez, vous ne pouvez pas faire ce que vous voulez. C'est décidé ailleurs. Pour un argument de fonction, l'appelant décide. Pour cette expression particulière, il est déterminé par l'endroit où une réellement est.



7
votes

Si vous n'écrivez pas explicitement & a code> il ne sera stocké nulle part. Si vous écrivez, l'adresse sera calculée et stockée dans une variable non nommée (temporaire) ou une variable nommée que vous écrivez.

Par exemple: P>

functionCall( &a ); // address will be in a temporary variable used for passing the parameter
int** b = &a; // address will be stored in variable b
otherFunctionCall( &&a ); // illegal, since &a is an expression operator & can't be applied to it


4 commentaires

Même si je n'écris pas et que je n'ai pas l'endroit où A est réellement stocké?


@DTA: Je ne suis pas certain que je comprends votre question ici ... A est stocké sur la pile, comme toute autre variable locale. Lorsque vous écrivez & a , le programme calcule l'adresse de l'endroit où la pile A est stockée (elle connaît déjà le pointeur de pile car il s'agit d'un registre et il connaît le décalage dans la Cadre de pile car cela est compilé dans une constante) et fait quelque chose avec elle, comme expliqué par Sharpooth.


Eh bien, Yeap. Vous confondez à nouveau la variable et l'adresse de la variable. Ils ne sont généralement pas égaux. La variable est une pièce de mémoire située à une adresse et contenant une certaine valeur.


Cela m'aide beaucoup. (Le long de la réponse de Sharpoth) Stackoverflow.com/Questtions/991075/...



3
votes

& A est l'adresse d'un. C'est une valeur, le résultat de l'opérateur et appliqué à A, et n'est pas "stocké" et n'a pas d'adresse, donc & (& a) n'est pas valide. C'est comme 2 + 3.


0 commentaires

0
votes

a est une variable de type "adresse de int"; & a est l'adresse de la variable A; & (& a) serait l'adresse de l'adresse de la variable A, ce qui n'a aucun sens


0 commentaires

4
votes

A n'est pas "une adresse dans laquelle un entier peut être stocké". A est une variable assez grande pour maintenir l'adresse d'un entier. Le seul "entier" que vous pouvez stocker directement dans A est l'adresse d'un entier, considéré comme un entier lui-même: xxx

il est correct que a a une adresse, qui est & a , mais cette adresse n'est pas stockée quelque part explicite, au moment de l'exécution.

à un tronçon, vous pourrez peut-être stocker quelque chose qui ressemble à l'entier 0: xxx

mais il s'agit simplement d'une syntaxe sténographique pour "le pointeur null", c'est-à-dire une valeur de pointeur garantie de ne pas être l'adresse d'un objet réel .


1 commentaires

Cette réponse n'est pas parfaite ... mais c'est une définitive +1, comme je pense que cela a définitivement la meilleure chance d'expliquer / répondre à la question initiale de l'Asker.



0
votes

Pas tout à fait. A est une variable dans laquelle une adresse de certains entiers peut être stockée. & a est l'adresse de A , i. e. L'adresse de la variable A , qui peut contenir une adresse de certains entier.

Très important: jusqu'à ce que et à moins qu'une adresse de quelque chose est attribuée à a , il s'agit d'un pointeur non initialisé. Essayer d'utiliser tout ce qu'il pointe conduira à des résultats imprévisibles et va probablement planter votre programme.


0 commentaires

0
votes

Vous pouvez avoir un pointeur sur un pointeur.

ex: xxx

Un pointeur prend la mémoire. C'est juste un petit conteneur qui tient l'adresse de quelque chose. Il ne peut tout simplement pas prendre "sans espace" car tout dans l'ordinateur est représenté d'une manière ou d'une autre par des chiffres. C'est juste qu'en termes de C / C ++ est concénéré, INT * A est simplement un pointeur à un objet et ne prend aucun espace. C'est-à-dire de vous empêcher de devoir gérer une sorte de mémoire ... il maintient la machine séparée du code.


1 commentaires

Un pointeur prend certainement une mémoire. int * a; Allouère une variable locale sur la pile, qui prend en charge de nombreux octets est nécessaire pour stocker un pointeur sur votre machine.



1
votes

Vous pouvez continuer à aller pour toujours:

int value = 742;
int *a = &value;
void *b = &a;
void *c = &b;
void *d = &c;


1 commentaires

Oui, mais utiliser le vide est généralement fronça les sourcils. Il serait préférable d'écrire int ** b, int *** c, int **** d, etc.



0
votes

int * a; est un pointeur à un INT appelé 'a'. &une; est la déréfrence de INT * A. Ça pointe de lui-même. C'est ce que vous utiliseriez pour pointer vers la variable que vous vouliez transmettre de fonction à fonctionner. Derefrence est juste un mot de fantaisie pour "obtenir l'adresse" & (& (& a)) n'est pas une expression valide comme indiqué précédemment. Vous pouvez faire un pointeur sur un pointeur sur un pointeur. C'est peut-être ce que vous pensez. Dans un tel cas, vous auriez Derefrence le dernier pointeur en question et l'ordinateur doit comprendre de quoi vous parlez.

Répondre à la question "Où est" une question "stockée"; sur la pile.

S'il vous plaît, si je suis incorrect sur quoi que ce soit, faites le moi savoir.


0 commentaires

0
votes

& A est un numéro qui est une rvalue: vous pouvez le stocker quelque part si vous souhaitez dans une variable, vous aurez déclaré ou alloué, de type INT *.

à savoir: P>

42
42
39
39


0 commentaires

2
votes

int * a est une variable de la taille d'un pointeur, comme int b serait une variable INT automatique.

Si cette déclaration est dans une fonction, Cette variable est automatique et stockée sur [ pile ] ( http://fr.wikipedia.org/wiki/stack_ (data_stacture) #hardware_stacks) au moment de l'exécution (un simple décompre de pile alloue la mémoire pour elle).

Si la déclaration est globale, alors "A" est simplement mappé dans l'exécutable .Data zone.

plus et les signes ajoutés peuvent" créer un stockage ", en raison des variables temporaires vous utilisez pour Hold'em;): xxx

La dernière ligne se plaint du fait que & nécessite que l'opérande soit un lvalue . C'est-à-dire quelque chose d'assignable - comme B et c ci-dessus. (& a) Comme résulte d'une expression qui n'est pas stockée nulle part, n'est donc pas un lvalue .


0 commentaires

0
votes
int* a;
This line simply declares a pointer to an integer. That pointer has a memory location, which you can get the address of using &a. & is an operator that returns the address of whatever it is run on. But if you do not assign this value anywhere, there is no further &-ing possible.As to your question as to where &a is stored, most likely in a register. If you do not use the value, it will be immediately discarded. (And registers do not have memory addresses, which is why you cannot do &(&a))

0 commentaires

1
votes

Au creux de votre problème semble être un manque de compréhension de la nature physique de la mémoire et des pointeurs. Pas comment fonctionne le code. Comme vous êtes sûr que vous savez, la mémoire physique est composée d'un grand groupe de cellules adjacentes. Les adresses de ces cellules sont fixées et codées dur par l'ordinateur lui-même, non par les applications de logiciels ou le langage de programmation que vous utilisez. Lorsque vous vous référez à & A, vous vous référez au bloc physique de la mémoire qui détient actuellement votre valeur que vous avez stockée dans la RAM de l'ordinateur. "A" est simplement un nom que vous avez donné à l'ordinateur afin qu'il sache exactement quel bloc de mémoire trouver la valeur que vous avez stockée. Je pense que cela couvre à peu près l'adresse mémoire.
Permet de passer sur des pointeurs maintenant. Un pointeur est une autre adresse de mémoire, appelée par l'ordinateur. Il a le nom que vous le donnez. Dans ce cas, il convient d'appeler quelque chose d'autre en plus du même nom que vous avez donné votre première valeur. Permet de l'appeler "b". Basé sur la façon dont vous l'avez dit. L'emplacement de la mémoire de B est capable de maintenir un type de données .... Un autre emplacement mémoire .... Alors, quand je dis: B = & A Je dis que l'adresse de la mémoire de 'B' (qui est conçue uniquement pour tenir Adresses de mémoire), est de contenir l'adresse de la mémoire de 'A'. Pendant ce temps, de l'autre côté de la ville, l'adresse de la mémoire de 'A' a un entier stocké dedans.

J'espère que cela n'a pas eu de déroutant, j'ai essayé de ne pas avoir tout Techno-Babble sur vous ici. Si vous êtes toujours confus. Post à nouveau, mal expliquer avec code la prochaine fois.

-UBCSE


0 commentaires

1
votes

in c, une variable x peut agir comme une valeur (sur le côté droit de =, où il s'appelle un rvalue ), ou il peut agir comme un conteneur pour les valeurs (sur le côté gauche de =, où il s'appelle un lvalue ). Vous pouvez prendre l'adresse de x , car vous pouvez prendre l'adresse de tout lvalue, cela vous donne un pointeur sur le conteneur. Mais comme un pointeur est une rvalue, pas un conteneur, vous ne pouvez jamais prendre & (& x) . En fait, pour tout lvalue l , & l est légal mais & (& l) n'est jamais légal.


0 commentaires