p
ist ein Zeiger auf ein Feld von 3 Elemente wie folgt aus:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p
beachten, dass es bei der gesamten Anordnung weist kein einziges Element.
Der Ausdruck *p[i]
wird aufgrund der Vorrangstellung des Bedieners als *(p[i])
behandelt (entspricht *(*(p + i))
). Dies bedeutet, dass Sie den Zeiger auf das Array indexieren. Wenn Sie p[1]
tun, zum Beispiel, bewegen Sie den Mauszeiger entlang auf den „nächsten“ Array und Versuch zu dereferenzieren:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p + 1
Wie wir sehen können, gibt es nichts gibt es, und Sie werden nicht definiertes Verhalten bekommen. Wenn Sie jedoch (*p)[i]
(entspricht *((*p) + i)
) ausführen, stellen Sie sicher, dass die Dereferenzierung zuerst erfolgt. Die Dereferenzierung gibt uns das Array selbst, das dann implizit durch eine Zeiger-zu-Zeiger-Umwandlung in einen Zeiger auf das erste Element des Arrays umgewandelt werden kann. Also, was man bekommt, ist:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ *p
In diesem Fall wird der Zeiger zeigt auf dem Array Element und nicht das gesamte Array. Wenn Sie dann Index zum Beispiel (*p)[1]
, die Sie erhalten:
┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ (*p) + 1
Dies gibt Ihnen ein gültiges const char*
, die dann von cout
ausgegeben werden können.
Große Antwort. Ich wusste nicht, dass ich immer mehr versuchen würde, ein anderes Array zu dereferenzieren, obwohl mir der Vorrang der Operatoren bewusst war. Ich muss in der Denkweise eines Arrays stecken bleiben, das ein Zeiger ist. – thelittlegumnut