Es gibt drei Dinge, die die gleiche Adresse darstellt: array
(die &array[0]
zerfällt), array[0]
(die &array[0][0]
zerfällt) und &array
.
Während diese drei Dinge in der gleichen Adresse resultiert, sie repräsentieren verschiedene Dinge, und haben daher verschiedene Arten.
Die Ausdrücke array
und &array[0]
haben den Typ char(*)[3]
.
Die Ausdrücke array[0]
und &array[0][0]
haben den Typ char*
.
Schließlich hat der Ausdruck &array
den Typ char(*)[3][3]
.
Es könnte einfacher sein, zu verstehen, wenn es ein wenig mehr „grafisch“ dargestellt:
Das Array, in Speicher, sieht so etwas wie dieses
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Wenn wir setzen in denen alle Zeiger wirklich verweisen wir
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^ ^ ^
| | | | |
| | &array[1] &array[2] &array[3]
| | | | |
| | &array[1][0] &array[2][0] &array[3][0]
| | |
| &array[0][1] |
| |
&array (&array)[1]
|
&array[0]
|
&array[0][0]
natürlich haben, array[3]
ist ou t Grenzen, aber es kann verwendet werden, während über die Anordnung (en) mit Hilfe von Zeigern iteriert wird, um das Ende zu markieren (d. h. Sie iterieren, während der Zeiger weniger als z. &array[3][0]
)
Dies ist in der Tat die gleiche Adresse. Der effektive Typ jedes lvalue, der für den Zugriff verwendet wird, ist jedoch unterschiedlich. – StoryTeller
Verstehst du, dass der _spot_, in dem du dich gerade befindest, sich von _you_ unterscheidet? Gleiche Sache. – PSkocik
Der Code, den Sie zeigen, ist nicht C oder zumindest falsch C. Er kompiliert nicht. – alk