Drucken von C-Zeigeradressen

Lesezeit: 4 Minuten

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

Benutzer-Avatar
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:

  1. x hat den Wert 1 und die Adresse 1000
  2. y hat den Wert 2 und die Adresse 1004
  3. ip hat den Wert 1000 (die Adresse von x) und die Adresse 1008

Folgendes berücksichtigen:

  1. x == 1 und &x == 1000
  2. y == 2 und &y == 1004
  3. 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).

Benutzer-Avatar
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.

1217400cookie-checkDrucken von C-Zeigeradressen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy