Frage

Sagen wir den folgenden Code haben:

int main(){
    int a[3]={1,2,3};
    printf("      E: 0x%x\n", a);
    printf("  &E[2]: 0x%x\n", &a[2]);
    printf("&E[2]-E: 0x%x\n", &a[2] - a);
    return 1;
}

Wenn kompiliert und ausgeführt sind die Ergebnisse folgendermaßen aus:

      E: 0xbf8231f8
  &E[2]: 0xbf823200
&E[2]-E: 0x2

Ich verstehe das Ergebnis der & E [2] , die 8 plus die Adresse des Array, indiziert, da durch 2 und vom Typ int (4 Byte auf meinem 32-Bit-System), aber ich kann‘ t herauszufinden, warum die letzte Zeile 2 statt 8?

Darüber hinaus, welche Art der letzten Zeile sein sollte - eine ganze Zahl oder eine ganze Zahl Zeiger

Ich frage mich, ob es das C-Typ-System (ein bisschen Gießen) ist, dass diese Marotte machen?

War es hilfreich?

Lösung

Sie haben sich daran zu erinnern, was der Ausdruck a[2] wirklich bedeutet. Es ist genau das entspricht *(a+2). So sehr, dass es vollkommen legal ist 2[a] statt zu schreiben, mit gleicher Wirkung.

Für die Arbeit und Sinn macht, nimmt Pointer-Arithmetik Konto in der Art der Sache zu spitz. Aber das ist gesorgt die Kulissen von hinten. Sie erhalten einfach natürliche Offsets in Ihre Arrays zu verwenden, und alle Details nur trainieren.

Die gleiche Logik gilt für Zeiger Unterschiede, die Ihr Ergebnis von 2 erklärt.

Unter der Haube in Ihrem Beispiel wird der Index durch sizeof(int) multipliziert Offset ein Byte zu erhalten, die auf die Basisadresse des Arrays hinzugefügt wird. Sie entlarven dieses Detail in Ihren zwei Drucken der Adressen.

Andere Tipps

Wenn Zeiger des gleichen Typs subtrahiert das Ergebnis Anzahl der Elemente und nicht die Anzahl von Bytes. Das ist von Entwurf, so dass Sie leicht Index Arrays jeder Art. Wenn Sie Anzahl von Bytes wollen -. Werfen die Adressen * auf char

Wenn Sie den Zeiger um 1 (p + 1) erhöht dann würde Zeiger auf nächste gültige Adresse verweist durch Zugabe von (p + sizeof (Typ)) Bytes zu p. (Wenn Typ ist int dann p + sizeof (int))

Eine ähnliche Logik gilt für p-1 auch (natürlich subtrahieren in diesem Fall).

Wenn Sie nur diese Grundsätze gelten auch hier:

In einfachen Worten:

a[2] can be represented as (a+2)
a[2]-a      ==>  (a+2) - (a)    ==> 2

Also, hinter der Szene,

a[2] - a[0]  
==> {(a+ (2* sizeof(int)) ) - (a+0) }  / sizeof(int) 
==> 2 * sizeof(int) / sizeof(int) ==> 2

Die Linie & E [2] -2 tut Zeiger Subtraktion, nicht integer Subtraktion. Zeiger Subtraktion (wenn beiden Zeiger auf Daten des gleichen Typs weisen) gibt die Differenz der Adressen in durch die Größe von der Art, sie zu Punkt geteilt. Der Rückgabewert ist ein int.

Um die „update“ Frage zu beantworten, wieder Arithmetik (diesmal Zeiger zusätzlich) Zeiger ausgeführt wird. Es wird getan, um diese Art und Weise in C leichter zu machen „Index“ ein Stück von zusammenhängenden Daten durch den Zeiger gezeigt.

Sie können in Pointer-Arithmetik in C Fragen und Antworten interessiert sein.

im Grunde, + und -. Betreiber Elementgröße berücksichtigen, wenn sie auf Zeiger verwendet

Wenn Addieren und Subtrahieren Zeiger in C, verwenden Sie die Größe des Datentypen anstelle von absoluten Adressen.

Wenn Sie einen int-Zeiger haben und fügen Sie die Nummer 2 auf sie, wird es voran 2 * sizeof (int). Auf die gleiche Weise, wenn Sie zwei int Zeiger subtrahieren, werden Sie das Ergebnis in Einheiten von sizeof (int) statt der Differenz der absoluten Adressen bekommen.

(Zeiger mit der Größe des Datentypen zu haben, ist sehr bequem, so dass man zum Beispiel einfach p++ anstatt die Größe des Typs angeben, jedes Mal verwenden kann. p+=sizeof(int))

Re: „Darüber hinaus, welche Art der letzten Zeile sollte sein, eine ganze Zahl oder einen ganzzahligen Zeiger ??“

eine ganze Zahl / Anzahl. aus dem gleichen Grund, dass der: Heute - 1. April = Anzahl. nicht Datum

Wenn Sie die Byte-Unterschied sehen möchten, müssen Sie auf einen Typ haben, die 1 Byte groß ist, wie folgt aus:

printf("&E[2]-E:\t0x%x\n",(char*)(&a[2])-(char*)(&a[0]))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top