Ich lerne zum ersten Mal etwas über C-Zeiger und -Adressen und wie ich sie auf meinem Tablet verwende
Sagen wir:
int x = 1, y = 2;
int *ip; // declares *ip as an int type?
ip = &x; //assigns the address of x to ip?
y = *ip; //y is now 1 via dereferencing
Sind alle Kommentarerklärungen korrekt?
Was passiert, wenn ich das Ergebnis von ip drucke? Wird es die Adresse der Variablen x drucken, so etwas wie
011001110
Neugierig, warum Sie es nicht versuchen?
– ChiefTwoPencils
14. Januar 2014 um 2:11 Uhr
Ich würde den ersten Kommentar als “deklariert ip als Zeiger-auf-Int-Typ” formulieren. Der Rest sieht gut aus. Soweit zum Drucken ipja, Sie bekommen die Adresse von x. Das Format der Adresse hängt ganz davon ab, welche Formatzeichenfolge Sie zum Drucken verwenden. Sie können es in Dezimal, Hex oder was auch immer schreiben.
– Schleicher
14. Januar 2014 um 2:11 Uhr
hackt
Ja. Alle deine Aussagen sind richtig. Allerdings im ersten Fall
int *ip;
es ist besser, das zu sagen ip ist ein Zeiger auf ein int Typ.
Was passiert, wenn ich das Ergebnis von ip drucke?
Es wird die Adresse von gedruckt x.
Wird es die Adresse der Variablen x drucken, so etwas wie
011001110
Nein. Adressen werden generell hexadezimal dargestellt. Du solltest benutzen %p Bezeichner, um die Adresse zu drucken.
printf("Address of x is %p\n", (void *)ip);
HINWEIS:
Beachten Sie dies in der obigen Erklärung * ist nicht der Indirektionsoperator. Stattdessen gibt es den Typ von an pdas dem Compiler mitteilen p ist ein Zeiger auf int. Das * Symbol führt nur dann eine Indirektion durch, wenn es in einer Anweisung erscheint.
Kann ich nicht einfach sagen: int ip; Statt int *ip? Schließlich ist * als dereferenzierender unärer Operator definiert, nicht als Typbezeichner.
– Robert Roche
14. Januar 2014 um 2:20 Uhr
Nein. * in der Deklaration ist kein Dereferenzierungsoperator.
– Hacken
14. Januar 2014 um 2:22 Uhr
@robertrocha Genau.
– Havenar
14. Januar 2014 um 2:28 Uhr
@robertrocha Es gibt keinen Zeiger Typ. Es gibt Hinweise darauf Typen.
– Fiddle Bits
14. Januar 2014 um 2:41 Uhr
int x = 1, y = 2;
int *ip; // declares ip as a pointer to an int (holds an address of an int)
ip = &x; // ip now holds the address of x
y = *ip; // y now equals the value held at the address in ip
Betrachten Sie Folgendes als Beispiel:
Initializer x y ip
Memory Value [1] [2] [1000]
Memory Address 1000 1004 1008
Wie du sehen kannst:
x hat den Wert 1 und die Adresse 1000
y hat den Wert 2 und die Adresse 1004
ip hat den Wert 1000 (die Adresse von x) und die Adresse 1008
Folgendes berücksichtigen:
x == 1 und &x == 1000
y == 2 und &y == 1004
ip == 1000 und &ip == 1008 und *ip == 1 (der Wert von x)
Ich hoffe, das hilft Ihnen, sich vorzustellen, was passiert.
Es ist alles richtig.
1. Zeile: Sie deklarieren zwei Variablen
2. Zeile: Es wird ein Speicherzeiger “ip” definiert
3. Zeile: Dem Pointer ip wird die Speicheradresse von X übergeben
4. Zeile: Y wird nun auf den Wert der Variable X an der Adresse ip gesetzt
Die Speicheradresse ist jedoch im Hexadezimalformat. 011001110 ist ein Datenbyte und keine Speicheradresse. Die Adresse wird eher so etwas wie 0x000000000022FE38 sein (sie kann kürzer sein). Bedenken Sie:
int x = 0;
int *ptr = &x; //the "&" character means "the address of"
printf("The variable X is at 0x%p and has the value of %i", (void *)ptr, x);
Dies würde die Adresse von X anstelle von *ptr ausgeben. Sie benötigen einen weiteren Zeiger, um die Adresse von *ptr auszugeben. Aber das ist ziemlich sinnlos, da ein Zeiger definiert ist, um die Adresse einer Variablen auszugeben. Stellen Sie es sich als Alias für eine andere Variable vor (ihr Wert ist der Wert an dieser Speicheradresse).
Bill Tyler
Ich mag die Aussage des ursprünglichen Posters *ip ist ein int. Dies spiegelt genau die Semantik von Deklarationen wider, bei denen der Deklarator *ip ist in diesem Fall ein Ausdruck und der/die Deklarationsbezeichner int, geben Sie den Typ des Ausdrucks an. Die Bedeutung auf diese Weise anzugeben, gibt einen Einblick in die Bedeutung von etwas wie int *ip, q; wo q ist einfach ein int. Vielleicht möchten Sie diese formellere Art, den Typ in einer Konversation anzugeben, nicht verwenden, aber es ist hilfreich, um die zugrunde liegende Struktur zu sehen, die durch die Deklaration ausgedrückt wird.
12174000cookie-checkDrucken von C-Zeigeradressenyes
Neugierig, warum Sie es nicht versuchen?
– ChiefTwoPencils
14. Januar 2014 um 2:11 Uhr
Ich würde den ersten Kommentar als “deklariert ip als Zeiger-auf-Int-Typ” formulieren. Der Rest sieht gut aus. Soweit zum Drucken
ip
ja, Sie bekommen die Adresse vonx
. Das Format der Adresse hängt ganz davon ab, welche Formatzeichenfolge Sie zum Drucken verwenden. Sie können es in Dezimal, Hex oder was auch immer schreiben.– Schleicher
14. Januar 2014 um 2:11 Uhr