Wenn ich ein Array wie folgt deklariert habe:
%Vor%warum ist das dann:
%Vor%während:
%Vor% Ich verstehe nicht, wie das Hinzufügen von 0 zum Zeiger die sizeof
-Ausgabe ändert. Gibt es vielleicht eine implizite Art Besetzung?
Wenn Sie 0
zu a
hinzufügen, wird a
zuerst in einen Zeigerwert vom Typ int(*)[2]
konvertiert (der auf das erste Element eines Arrays vom Typ int[3][2]
verweist). Dann wird 0
hinzugefügt, was 0 * sizeof(int[2])
bytes zu der durch diesen Zeigerwert repräsentierten Adresse addiert. Da diese Multiplikation 0 ergibt, wird derselbe Zeigerwert erhalten. Da es sich um einen Zeiger handelt, liefert sizeof(a+0)
die Größe eines Zeigers, der auf Ihrer Box 8 Bytes beträgt.
Wenn Sie sizeof(a)
eingeben, gibt es keinen Grund für den Compiler, a
in einen Zeigerwert zu konvertieren (was nur Sinn macht, wenn Sie Elemente indexieren oder Zeigerarithmetik mit der Adresse der Elemente ausführen wollen). Der Ausdruck a
bleibt also ein Array-Typ und Sie erhalten die Größe von int[3][2]
statt der Größe von int(*)[2]
. Also, 3 * 2 * sizeof(int)
was auf deiner Box 24 Bytes ist.
Hoffe das klärt die Dinge.
sizeof
sagt Ihnen die Größe des Typs des Ausdrucks. Wenn Sie 0
zu a
hinzufügen, wird der Typ zu einem Zeiger (8 Byte auf 64-Bit-Systemen).