Wenn Sie &a
nicht explizit schreiben, wird es nirgendwo gespeichert. Wenn Sie schreiben, wird die Adresse berechnet und entweder in einer unbenannten Variablen (temporär) oder einer benannten Variablen gespeichert, die Sie schreiben.
Zum Beispiel:
%Vor% a
ist keine "Adresse, an der eine Ganzzahl gespeichert werden kann". a
ist eine Variable, die groß genug ist, um die Adresse einer Ganzzahl zu enthalten. Die einzige "Ganzzahl", die Sie direkt in a
speichern können, ist die Adresse einer Ganzzahl, die als Integer selbst betrachtet wird:
Es ist korrekt, dass a
selbst eine Adresse hat, die &a
ist, aber diese Adresse wird zur Laufzeit nicht explizit gespeichert.
Sie können möglicherweise etwas speichern, das wie die Ganzzahl 0 aussieht:
%Vor%Aber dies ist nur eine Kurzschriftsyntax für "den NULL-Zeiger", d. h. einen Zeigerwert, der garantiert nicht die Adresse eines tatsächlichen Objekts ist.
& amp; a ist die Adresse von a. Es ist ein Wert, Ergebnis des Operators & amp; angewendet auf a, und ist nicht "gespeichert" und hat keine Adresse, so ist & amp; (& amp; a) ungültig. Es ist wie 2 + 3.
int *a
ist eine Variable, die die Größe eines Zeigers hat, genauso wie int b
eine automatische int-Variable wäre.
Wenn diese Deklaration in einer Funktion ist, ist diese Variable automatisch und gespeichert in [ stack
] ( Ссылка zur Laufzeit (ein einfaches Stack-Dekrement weist Speicher dafür zu).
Wenn die Deklaration global ist, wird 'a' einfach in .DATA
Bereich.
Noch mehr & amp; Angehängte Zeichen können aufgrund der temporären Variablen, die Sie zum Speichern verwenden, "Speicher erstellen" erstellen:):
%Vor% Die letzte Zeile beschwert sich darüber, dass &
verlangt, dass der Operand ein lvalue
ist. Das heißt, etwas zuweisbar - wie b
und c
oben. (&a)
as ist das Ergebnis eines Ausdrucks, der nirgendwo gespeichert wird und daher kein lvalue
ist.
An der Wurzel Ihres Problems scheint ein Mangel an Verständnis für die physische Natur der Erinnerung und Zeiger zu sein. Nicht wie der Code funktioniert. Wie Sie sicher wissen, besteht der physische Speicher aus einer großen Gruppe benachbarter Zellen. Die Adressen dieser Zellen werden vom Computer selbst festgelegt und fest codiert, nicht von Software-Apps oder der Programmiersprache, die Sie verwenden. Wenn Sie sich auf & amp; a beziehen, beziehen Sie sich auf den physischen Speicherblock, der momentan Ihren Wert hält, den Sie im Computer-RAM gespeichert haben. "a" ist einfach ein Name, den Sie dem Computer gegeben haben, damit er genau weiß, welcher Speicherblock den von Ihnen gespeicherten Wert finden soll. Ich denke, dass so ziemlich die Speicheradresse abgedeckt ist.
Lass uns jetzt über Zeiger gehen. Ein Zeiger ist eine weitere Speicheradresse, auf die der Computer verweist. Es hat welchen Namen auch immer du gibst. In diesem Fall sollte es etwas anderes außer dem gleichen Namen genannt werden, dass Sie Ihren ersten Wert gaben. Nennen wir es "b". Basierend darauf, wie Sie es erklärt haben. Der Speicherplatz von b ist nur in der Lage, eine Art von Daten zu halten .... eine andere Speicherstelle .... also wenn ich sage: b = & amp; a sage ich, dass die Speicheradresse von 'b' (die nur entworfen wird um Speicheradressen zu halten), soll die Speicheradresse von 'a' halten. Auf der anderen Seite der Stadt ist in der Speicheradresse von 'a' eine Ganzzahl gespeichert.
Ich hoffe, dass das nicht verwirrend wurde, ich habe versucht, hier nicht alles Techno-Geplapper zu bekommen. Wenn du immer noch verwirrt bist. Beitrag erneut, erkläre das nächste Mal mit Code.
-UBcse
In C kann eine Variable x
als Wert fungieren (auf der rechten Seite von =, wobei sie rvalue genannt wird), oder sie kann als -Container fungieren für Werte (auf der linken Seite von =, wo es ein lvalue genannt wird). Sie können die Adresse von x
verwenden, da Sie die Adresse von any lvalue verwenden können. Dies gibt Ihnen einen Zeiger auf den Container. Da ein Zeiger jedoch ein R-Wert und kein Container ist, können Sie niemals &(&x)
verwenden. Tatsächlich ist für jeden Lvalue l
, &l
legal, aber &(&l)
ist niemals legal.
Nicht ganz. a
ist eine Variable, in der eine Adresse einer ganzen Zahl gespeichert werden kann. &a
ist die Adresse von a
, i. e. die Adresse der Variablen a
, die eine Adresse einer ganzen Zahl enthalten kann.
Sehr wichtig: Bis und wenn eine Adresse von etwas a
zugewiesen ist, ist es ein nicht initialisierter Zeiger. Der Versuch, alles zu verwenden, was darauf hinweist, führt zu unvorhersehbaren Ergebnissen und wird wahrscheinlich Ihr Programm zum Absturz bringen.
Sie können einen Zeiger auf einen Zeiger haben.
Beispiel:
%Vor%Ein Zeiger belegt Speicher. Es ist nur ein kleiner Container, der die Adresse von etwas enthält. Es kann einfach nicht "keinen Platz" einnehmen, weil alles im Computer irgendwie durch Zahlen repräsentiert wird. Es ist nur, dass, soweit C / C ++ konzentriert ist, int * a einfach ein Zeiger auf ein Objekt ist und keinen Platz einnimmt. Das bedeutet, dass Sie nicht jede Art von Speicher verwalten müssen ... es hält die Maschine vom Code getrennt.
int * a; ist ein Zeiger auf einen Int namens 'a'. & amp; a; ist der Wert von int * a. es zeigt auf sich selbst. Das ist es, was Sie verwenden würden, um auf die Variable zu zeigen, die Sie von Funktion zu Funktion weitergeben wollten. derreference ist nur ein schickes Wort für "die Adresse zurückbekommen" & amp; (& amp; (& amp; a)) ist kein gültiger Ausdruck wie zuvor angegeben. Sie können einen Zeiger auf einen Zeiger auf einen Zeiger machen. Das könnte sein, woran du denkst. In einem solchen Fall würden Sie den letzten Zeiger in Frage stellen und der Computer sollte verstehen, worüber Sie sprechen.
Um die "wo ist" eine "gespeicherte" Frage zu beantworten; auf dem Stapel.
Bitte, wenn ich in irgendetwas nicht korrekt bin, lass es mich wissen.
& amp; a ist eine Zahl, die ein rvalue ist: Sie können es irgendwo speichern, wenn Sie eine Variable haben wollen, die Sie deklariert oder zugewiesen haben, vom Typ int *.
Um zu sagen:
%Vor%& amp; (& amp; a) ist keine legale Syntax. Wenn Sie einen Zeiger auf einen Zeiger auf einen int wollen:
%Vor%Sie müssen die Ebenen der Indirektion aufbauen.
Mit dem oben genannten können Sie das tun, wenn Sie möchten:
%Vor%Ausgabe von:
%Vor%Diese Zeile deklariert einfach einen Zeiger auf eine Ganzzahl. Dieser Zeiger hat einen Speicherort, an den Sie die Adresse von & amp; a erhalten können. &Ampere; ist ein -Operator , der die Adresse von dem zurückgibt, auf dem er ausgeführt wird. Aber wenn Sie diesen Wert nirgendwo zuweisen, ist keine weitere Möglichkeit möglich.
Was Ihre Frage betrifft, wo & amp; a gespeichert ist, am wahrscheinlichsten in einem Register. Wenn Sie den Wert nicht verwenden, wird er sofort verworfen. (Und Register haben keine Speicheradressen, weshalb Sie & amp; (& amp; a))
nicht tun können