2011-01-05 11 views
3

Ich habe gerade mit der Arbeit mit Zeigern in C begonnen und ich bin auf etwas einfach aufgelegt. Ich möchte sicherstellen, dass ich es richtig verstehe.Einfache C Pointer Clarification

sagen, dass ich so etwas wie dieses:

int *buff;

Von dem, was ich las,

*buff refers to the value that buff is currently pointing to
&buff refers to the address

Aber was ich bin fest ist:

Worauf bezieht sich nur "buff"? Bezieht es sich auf den Speicherort von & Buff im Speicher, die auf den Speicherort des Werts * Buff zeigt?

Vielen Dank! : 3

-jtsan

+1

Der unäre '*' und '' & Operatoren sind invers zueinander sind. Für alle "x" ist immer wahr, dass "* (& x) == x", und für alle gültigen Zeiger "x" gilt immer "& (* x) == x" (wenn "x" nicht ist) ein Zeiger, dann macht 'x' keinen Sinn und ist ein Syntaxfehler, wenn 'x' ein ungültiger Zeiger ist, dann ist '* x' syntaktisch gültig, führt aber zur Laufzeit zu undefiniertem Verhalten. –

Antwort

10

int * bedeutet "ein Zeiger auf ein int." Also, hier ist buff ein Zeiger auf ein int. Um die Dinge einfacher zu machen, lassen Sie uns auch sagen:

int x = 5; 
int *buff = &x; 

x, eine ganze Zahl, wird auf 5 gesetzt &x bedeutet „die Adresse von x“. So enthält buff die Adresse x. Nehmen wir als Argument an, dass x bei Speicheradresse 0x1000 gespeichert ist. Also buff selbst ist auch eine Nummer: 0x1000.

*buff bedeutet „das, was auf dem durch Schwabbelscheibe“, in diesem Fall 5

&buff bedeutet „die Adresse des Schwabbelscheibe“: die Adresse, unter der Nummer buff selbst im Speicher abgelegt ist.

Ich möchte eine allgemeine Technik teilen, die ich gelernt habe, wie Zeiger funktionierten, als ich anfing.

Holen Sie sich ein großes Blatt Millimeterpapier und legen Sie es in Längsrichtung auf den Tisch vor Ihnen. Dies ist der Speicher Ihres Computers. Jede Box repräsentiert ein Byte. Wählen Sie eine Reihe aus und legen Sie die Zahl "100" unter das Feld ganz links. Dies ist "die niedrigste Adresse" des Speichers. (Ich wählte 100 als eine beliebige Zahl, die nicht 0 ist, Sie können eine andere wählen.) Nummerieren Sie die Kästchen in aufsteigender Reihenfolge von links nach rechts.

 
+---+---+---+---+---+-- 
| | | | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

Jetzt, nur für den Moment, vorgeben, ein int ist ein Byte groß. Sie sind ein Acht-Bit-Computer. Schreiben Sie Ihre int a in eine der Boxen. Die Nummer unter der Box ist ihre Adresse. Wählen Sie nun eine andere Box, die int *b = &a enthalten soll. int *b ist auch eine Variable irgendwo im Speicher gespeichert, und es ist ein Zeiger, der &a enthält, die "a's Adresse" ausgesprochen wird.

int a = 5; 
int *b = &a; 
 
    a  b 
+---+---+---+---+---+-- 
| 5 | |100| | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

Jetzt können Sie dieses Modell verwenden, um visuell durch andere Kombinationen von Werten und Zeigern arbeiten, die Sie sehen. Es ist eine Vereinfachung (weil als Sprache Pedanten sagen, ein Zeiger ist nicht unbedingt eine Adresse, und Speicher ist nicht notwendigerweise sequentiell, und es gibt Stapel und Heap und Register und so weiter), aber es ist ein ziemlich gut Analogie für 99% der Computer und Mikrocontroller.

Sie können das Modell für echte Vier-Byte erweitern int zu s ...

int a = 5; 
char b = 2; 
 
    a a a a b 
+---+---+---+---+---+-- 
| 0 | 0 | 0 | 5 | 2 | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 
+0

Das war sehr hilfreich, danke! – masterwok

1

Sie sind richtig, dass *buff auf den Ort bezieht sich buff Punkte, aber &buff bezieht sich auf die Adresse von buff selbst. Die Adresse (&) der Daten, die buff zeigt auf (*) ist *&buff, oder häufiger nur buff.

Viel Glück. Zeiger sind ziemlich schwierig, aber du siehst aus, als ob du auf dem richtigen Weg bist.

+0

Könnten Sie versuchen, mehr Wörter und weniger Symbole zu verwenden, um zu sagen, was Sie sagen wollen? Willst du damit sagen, dass sich das '*' und das '&' gegenseitig negieren? Ich mache mir Sorgen, dass die aktuelle Antwort verwirrend ist. –

+0

Vielen Dank das war sehr hilfreich. :] – masterwok

+0

@Alex - Sie tun. –

3

* Buff bezieht sich auf den Wert, den Buff derzeit zeigt

Ja

& Buff bezieht sich auf die Adresse

Kein. Zumindest nicht, wenn du denkst, was ich denke, dass du denkst. &buff does nicht beziehen sich auf die Adresse dessen, was es gerade zeigt, &buff bezieht sich auf die Adresse im Speicher, in dem buff selbst befindet.

Worauf bezieht sich "buff" nur?

buff bezieht sich auf das, was Sie dachten, &buff war, das heißt die Adresse, was buff Punkte. Der Wert eines Zeigers ist die Adresse dessen, auf das er zeigt.

Hier sind einige Beispiele um Ihnen zu helfen:

  1. int *buff; - ein Zeiger auf int erklären, die derzeit nicht an einer beliebigen Stelle
  2. int foo; buff = &foo; - Punkt buff der Adresse von foo
  3. *buff = 5; - ändern Sie die Inhalt von dem, was Buff Punkte (foo) bis 5
  4. int **buff_ptr = &buff; - erklären ein Zeiger auf ein Zeiger auf int und es an die Adresse von Buff Punkt
4

die Erklärungen gegeben:

int value = 13; 
int *buff = &value; 

Du hast Recht:

*buff == 13 

weil buff Punkte value und enthält 13

Du bist wahrscheinlich Missverständnis, was &buff bezieht; Es ist die Adresse der Variablen buff, und so ist der Typ &buffint **, ein Zeiger auf einen Zeiger auf eine ganze Zahl. Im Gegensatz dazu ist &value die Adresse der Variablen value; es ist vom Typ int * (so dass die Initialisierung keine Umwandlung benötigt hat - es ist vom richtigen Typ, um in buff gespeichert zu werden).

Plain buff ist ein int * oder Zeiger auf eine ganze Zahl. Es enthält die Adresse der Variablen value.

3

Buff wurde als "Zeiger auf int" deklariert. using * buff ist wie "what buff zeigt auf", d. h. der int-Wert. Verwenden von & Buff ist wie "die Adresse von Buff" sagen, die die Adresse des Zeigers ist, der auf int (eine andere Ebene der Indirektion) zeigt.