8 Stimmen

Umwandlung eines Integer-Zeigers in eine Ganzzahl

Versucht folgenden Code zu überprüfen, was passiert, wenn wir Integer-Zeiger in eine ganze Zahl konvertieren.

 #include<stdio.h>
 #include<stdlib.h>
 int main()
 {
         int *p;
         int a;
         p = (int *)malloc(sizeof(int));
         *p = 10;
         a = (int)p;
         printf("%d\n",*p);
         printf("%d \n",a);
         return 0;
 }

 The output is : 10
                 135680008

Kann mir jemand das Konzept dieser Umstellung erklären? Alle Links zu diesem Thema wären ebenfalls hilfreich.

18voto

xtofl Punkte 39285

Offenbar verwechseln Sie den Zeiger mit dem Inhalt des Zeigers.

Als Analogie zur realen Welt könnte man sagen, dass ich, wenn ich auf einen Vogel zeige, meinen Zeigefinger in einen Vogel verwandeln möchte. Aber es gibt keine Beziehung zwischen dem Typ "Vogel" und "Finger".

Übertragen Sie diese Analogie auf Ihr Programm: Sie konvertieren das Objekt, das auf Ihr int zu einer int selbst. Da ein C-Zeiger als "die Nummer einer Speicherzelle" implementiert ist und da es Lose Speicherzellen zur Verfügung stehen, ist es offensichtlich, dass (int)p wird eine sehr große Zahl ergeben.

Casting ist eine unangenehme Sache. Es ist ein Zufall, dass Zeiger ganz analog zu ganzen Zahlen sind. Wenn sie als "die n" implementiert würden th Adresse des m th Speicherbank", würden Sie diese Frage nicht stellen, weil es keinen offensichtlichen Zusammenhang gäbe, und Sie wären nicht in der Lage gewesen, diesen Abdruck zu machen.

4voto

peoro Punkte 24751

135680008 ist die Adresse in dezimaler Form (sie wäre 0x8165008 in Hexadezimalzeichen), zu dem p zeigt auf: die Adresse des Speicherbereichs, der mit malloc .

1voto

Matt Whitworth Punkte 66

Hier drucken Sie die Speicheradresse von a aber Sie drucken es als vorzeichenbehaftete dezimale Ganzzahl aus. Das ist als Format nicht sehr sinnvoll, da einige hohe Speicheradressen, deren genaue Grenze von der Wortgröße und dem Compiler abhängt, als negativ ausgegeben werden.

Standardmäßig werden sie als vorzeichenlose Hexadezimalzahlen ausgedruckt, die mit Nullen auf 8 oder 16 Zeichen aufgefüllt werden (dies ist wiederum von der genauen Wortgröße abhängig). In printf wäre dies %#08X Die Speicheradresse 0x243 würde also als 0x00000243 gedruckt werden.

1voto

Nebulosus Punkte 11
uint64_t PointerToInt(void* ptr){
    uint64_t* u=(void*)&ptr;
    return *u;
}

wenn Sie Zeiger in 64 Bit unsigned int umwandeln wollen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X