:
int a[4][2];
definiert a
ein Array von 4 Elementen, von denen jeder ein Array von 2 int
Elemente. (Ein 2-dimensionales Array ist nicht mehr und nicht weniger als ein Array von Arrays.)
Ein Array-Ausdruck wird in den meisten Kontexten implizit in einen Zeiger auf das ursprüngliche (nullte) Element des Array-Objekts konvertiert. (Man beachte die Annahme, dass es ein Array Objekt, dass einige Angst verursacht hat, aber es ist hier nicht relevant.)
Die Fälle, in denen ein Array Ausdruck nicht in einen Zeiger umgewandelt werden:
- Wenn es der Operand
sizeof
ist;
- Wenn es der Operand von unary
&
ist; und
- Wenn es ein Zeichenfolgenliteral in einem Initialisierer ist, der zum Initialisieren eines Array-Objekts verwendet wird.
(Compiler-spezifische Erweiterungen wie gcc typeof
könnten mehr Ausnahmen erstellen.)
So im Ausdruck *a
, die subexpression a
(die int[4][2]
vom Typ ist) auf einen Zeiger vom Typ implizit int(*)[2]
umgewandelt wird (Zeiger auf das Array von 2 int
s).Die Anwendung von unary *
dereferenziert diesen Zeiger und gibt uns einen Ausdruck vom Typ int[2]
.
Aber wir sind nicht ganz noch nicht getan. *a
ist auch ein Ausdruck von Array-Typ, was bedeutet, dass, je nachdem, wie es verwendet wird, wahrscheinlich wieder in einen Zeiger umgewandelt werden, diesmal von Typ int*
.
Wenn wir sizeof *a
schreiben, die subexpression a
int[4][2]
-int(*)[2]
umgewandelt wird, aber die subexpression *a
ist nicht von int[2]
zu int*
umgewandelt, so dass der Ausdruck der Größe des Typs int[2]
ergibt.
Wenn wir **a
schreiben, tritt die Konvertierung auf. *a
ist vom Typ int[2]
, der in int*
umgewandelt wird; Dereferenzierung, die einen Ausdruck vom Typ int
ergibt.
Beachten Sie, dass trotz der Tatsache, dass wir auf **a
mit zwei Zeigerdereferenzierungsoperationen verweisen können, gibt es keinen Zeiger Objekte. a
ist ein Array-Objekt, das vollständig aus 8 int
Objekten besteht. Die impliziten Konvertierungen ergeben Zeiger Werte.
Die impliziten Array-to-Zeigerumwandlungsregeln sind in Abschnitt 6.3.2.1 N1570 Absatz 3 (Dieser Absatz gibt falsch _Alignof
als vierte Ausnahme, aber _Alignof
kann nicht auf einen Ausdruck angewendet werden. Die veröffentlichte C11 Standard korrigiert den Fehler .)
Empfohlener Messwert: Abschnitt 6 der comp.lang.c FAQ.
Es gibt keinen "Zeiger auf Array". Ein Array ist kein Zeiger. "Dann wird' a' intern zum Zeiger des ersten Elements der Anordnung von 4 Elementen von 2 Ints umgewandelt. " ist einfach falsch! – Olaf
@Olaf Was meinst du mit gibt es keinen Zeiger auf Array? Bedeutet das nicht (int (* x) [4] [2]), dass x ein Zeiger auf ein Array von 4 Elementen von 2 Ints ist? – Jin
Wo erscheint das in deiner Frage ?? Wenn Sie den Kommentar bis zum Ende lesen und die Antworten verstanden haben, sollte es klar sein. 'a' ist ein Array, kein Zeiger! Und es ist nicht per se "in einen Zeiger umgewandelt". Warum ist es für Anfänger so kompliziert zu verstehen, dass unterschiedliche Syntax unterschiedliche Typen erzeugt? – Olaf