2016-07-03 24 views
-2

C ist mein Code:Warum undereferenced Zeiger haben diffrent sizeof als dereferenced - So, hier ++

cout << "The size of an integer is " << sizeof(int) << endl; 
cout << "The size of a double is " << sizeof(double) << endl; 
cout << "The size of a string is " << sizeof(string) << endl; 
int num = 1234; 
cout << "The size of a num is " << sizeof(num) << endl; 
int *pnum = &num; 
cout << "The size of a pointer pnum is " << sizeof(pnum) << endl; 
cout << "The size of a value pointed at by pnum is " << sizeof(*pnum) << endl; 
return 0; 

Im dieses Stück Code verwirrt, weil Ausgabe dieser ist:

The size of an integer is 4 
The size of a double is 8 
The size of a string is 40 
The size of a num is 4 
The size of a pointer pnum is 8 
The size of a value pointed at by pnum is 4 

Ich denke, Größe ein Zeiger pnum sollte der gleiche Wert sein, auf den pnum zeigt, weil ich ein Tutorial "Programming C++" beobachte und in diesem Tutorial sind sie das gleiche. Kann jemand erklären, warum sie in meinem Programm nicht gleich sind?

+0

Da die zugrunde liegende dataty Pes haben unterschiedliche Größen? –

+0

Lass mich raten, du bist auf einem 64-Bit-System? Dann sind Zeiger normalerweise 64 Bits, während "int" immer noch 32 Bits ist. –

+0

Im Tutorial ist es nur ein Zufall, dass 'int' die gleiche Größe wie' int * 'hat. Die Größen variieren von System zu System. – Galik

Antwort

2

sizeof(pnum) ist genau das gleiche wie sizeof(int*), Anzahl der Bytes benötigt, um einen Zeiger auf den int-Wert darzustellen. Ein solcher Zeiger benötigt 64 Bits bei einem 64-Biss-System, was 8 Bytes entspricht, wie in Ihrer Code-Ausgabe gezeigt.

Gleichzeitig ist sizeof(*pnum) genau das gleiche wie sizeof(int), da *pnum den Typ int hat. Dieser Typ ist normalerweise 32 Bit lang, was 4 Byte ergibt.

+0

Danke für Ihre Antwort. – slayerr297

1

und in diesem Tutorial sind sie gleich:

der Grund, dass für diese spezielle Maschine sein könnte (wie meine eigenen 32-Bit-Maschine) sizeof (int) = sizeof (int *) = 4

.

der Grund, warum Sie unterschiedliche Ergebnisse erhalten, ist, dass *pnum die pointee von pnum ist, die ein int (4 Byte auf Ihrem Rechner) und pnum sich ein Zeiger (8 Byte auf Ihrem Rechner) ist

+1

Danke für Ihre Antwort. Jetzt habe ich das Programm im 32-Bit-Maschinenmodus gestartet und das Ergebnis ist im Tutorial ähnlich. – slayerr297

+2

@ slayerr297 Hat also das Tutorial tatsächlich gesagt, dass die Werte gleich sein sollen? Wenn ja, besorge dir ein anderes Tutorial, da das, was du gerade siehst, falsch ist. – PaulMcKenzie