2016-12-12 3 views
0

Nachdem Sie den Code unten ausgeführt wird, erhalte ich Ausgabe als 4.Wert durch Zeiger Subtraktion in einem bestimmten C-Code erzeugt

Kann mir jemand erklären, was in diesem Code geschieht.

Von meinem Verständnis:

Adresse von a [1], dh Array-Elemente 20 Adresse wird in Zeigervariable p gespeichert, und die Adresse 60 wird in der Variablen q gespeichert. q-p ist fertig und es wird gedruckt. Aber Ich habe erwartet, dass die Ausgabe etwas anderes ist.

Zum Beispiel unter Berücksichtigung der Startadresse des ersten Elements 100 zu sein und jedes Element benötigt 2 Bytes für die ganze Zahl. dann ist eine [0] Adresse 100, ein [1] 102, ein [2] 104, ein [3] 106, ein [4] 108, ein [5] 110.

jetzt Adresse von a [5] -Adresse eines [1] = 110-102 = 8

Aber Wert ist 4. Jede Erklärung dafür. Wo fehlt mir etwas?

Here (CodePad link) ist der C-Code:

int main() 
{ 
     int a[] = { 10, 20, 30, 40, 50, 60 }; 
     int *p = &a[1], *q = &a[5]; 
     printf("%d",q - p); 
     return 0; 
} 
+0

Weil '5 - 1 = 4', der Unterschied in den Indexwerten. –

+1

weil int Zeigern mem-Adressen in den Schritten zählen, 4 stellt die Menge an Speicher/sizeof (int) zwischen a [1] und a [5]. – George

+0

Sie benötigen '* q - * p ', wenn Sie die Werte subtrahieren möchten. Was Sie gerade tun, ist ihre Speicherwerte zu subtrahieren (was nicht anders ist als nur 5 - 1). – Rockybilly

Antwort

1

Pointer Unterschiede den Unterschied in sizeof(pointed_to_elem) zählen. Wenn Sie eine Rohbyte-Differenz wünschen, können Sie sie in char* umwandeln oder char* Zeiger verwenden.

printf("%d",(char*)q - (char*)p); 

Oder

char *p = (char*)&a[1], *q = (char*)&a[5]; 
1

In Zeigerarithmetik, die "Einheit" ist eine Größe des Datentyps. Dies ist der Grund, warum das Hinzufügen von 1 zu einem int Pointer, der auf ein Array-Element zeigt, das nächste Element im Array ergibt, egal wie viele Bytes die Größe int in dieser Plattform hat.

Gleicher Grund hier, wenn Sie die Adresse eines Array-Elements bei Index 5 von eins bei Index 1 subtrahieren, erhalten Sie 5 - 1 = 4, egal was der Datentyp im Array ist.


Auf einer Tangente, etwas im Zusammenhang, vielleicht hilfreich für das Verständnis: sizeof eines Arrays ist immer noch die Größe in Byte für das gesamte Array. Wenn Sie also Anzahl der Elemente in einem Array erhalten möchten, können Sie so etwas wie

int a[] = { ... }; 
int count = sizeof(a)/sizeof(*a); 
1

zu tun haben, wenn Sie Zeiger in das gleiche Array subtrahieren, erhalten Sie die gleiche Unterschied wie, wenn Sie die entsprechenden Indizes abgezogen. Die C-Pointer-Arithmetik funktioniert so, um zu verhindern, dass Sie die Größe des Array-Elements berücksichtigen müssen.

daher von der Adresse des a[j] die Adresse a[i] Subtrahieren gibt Ihnen das gleiche Ergebnis wie i von j subtrahiert wird.

anzumerken, dass das Ergebnis der Subtraktion des Typs ptrdiff_t, die nicht in eine ganze Zahl passen.

Verwandte Themen