Ich habe diese Frage über das Ergebnis von sizeof()
gesehen und die Ausgabe dieser Funktion nicht verstanden.
Wie ich annahm, wenn eine Funktion ein Array zum Arbeiten bekommt, bekommt sie einen Zeiger auf das Array, also wenn ich die erste Zeile von
ausdrucken werde %Vor%Die Ausgabe ist 8.
ABER ist nicht der nächste printf bringt mich zu diffrent pointer to pointer, dass seine größe wird auch 8?
Also ich werde das zu
führen %Vor%Die tatsächliche Ausgabe ist
%Vor%In dieser Aussage
%Vor% Ausdruck *matrix3d
hat den Typ char[20][30]
.
Wenn ein Array im Operator sizeof
als Ausdruck verwendet wird, wird der Ausdruck nicht in den Zeiger auf das erste Element des Arrays konvertiert.
Damit erhalten Sie die Ausgabe 600
.
Wenn Sie jedoch schreiben würden
%Vor% dann wird *matrix3d
mit dem Typ char[20][30]
implizit in den Ausdruck *matrix3d + 0
in den Zeiger vom Typ char ( * )[30]
konvertiert und die entsprechende printf
Anweisung wird 8,
Wie für den Funktionsparameter und sein Argument werden sie implizit in den Typ char ( * )[20][30]
Also zum Beispiel sind diese Funktionsdeklarationen äquivalent
%Vor%und deklariere die gleiche Funktion.
Zuerst müssen Sie wissen, dass sizeof
ein Operator und keine Funktion ist. Arrays werden nicht in Zeiger auf ihr erstes Element konvertiert, wenn es sich um einen Operanden von sizeof
oder unary &
operator handelt.
In der Funktion checkSizes
ist der Parameter matrix3d
vom Typ Zeiger auf ein Array von 20 Arrays von 30 char
s . Da es sich um einen Zeiger handelt, ist die Anweisung
wird die Größe eines Zeigers ausgeben.
Dereferenzieren des Zeigers matrix3d
gibt sein erstes Element. Das erste Element ist ein Array von 20 Arrays mit 30 char
s . sizeof(*matrix3d)
gibt die Größe des Arrays char[20][30]
zurück, also 600 Bytes. sizeof(*matrix3d)
entspricht sizeof(matrix3d[0])
.
Der Typ von **matrix3d
ist ein Array von 30 char
s , sizeof(**matrix3d)
wird 30 Bytes gedruckt.
Der Typ von ***matrix3d
ist a char
, sizeof(***matrix3d)
wird 1 Byte gedruckt.
Der erste ist, wie Sie sagten, die Größe eines Zeigers, also 8; der letzte ist die Größe eines Charakters, also 1; Die zweite ist sizeof (char) * 30 * 20, weil Sie die erste "Dimension" des Arrays dereferenziert haben, also schauen Sie sich an, was in einem der 10 Elemente dieser Dimension enthalten ist. Die dritte ist sizeof (char) * 30, weil Sie in ein Element der zweiten Dimension schauen.