Funktion mit Eingabe des Zeigers auf Zeiger auf

8

Ich habe diese Frage über das Ergebnis von sizeof() gesehen und die Ausgabe dieser Funktion nicht verstanden.

%Vor%

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%     
limitless 01.09.2016, 13:09
quelle

3 Antworten

2

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,

ausgeben

Wie für den Funktionsparameter und sein Argument werden sie implizit in den Typ char ( * )[20][30]

konvertiert

Also zum Beispiel sind diese Funktionsdeklarationen äquivalent

%Vor%

und deklariere die gleiche Funktion.

    
Vlad from Moscow 01.09.2016, 13:16
quelle
1

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

%Vor%

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.

    
haccks 01.09.2016 14:30
quelle
0

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.

    
Davide Visentin 01.09.2016 13:19
quelle

Tags und Links