Warum scheint der Verfall zum Zeiger für das Array-Argument nicht auf sizeof () zu liegen?

7

Ich habe früher eine Frage gelesen, die aufgrund einer exakten Kopie davon geschlossen wurde.

Wenn eine Funktion einen Array-Parameter bestimmter Größe hat, warum wird sie durch einen Zeiger ersetzt?

und

So finden Sie die 'sizeof' (a Zeiger auf ein Array zeigen)?

Aber nachdem ich dies gelesen habe, bin ich immer noch verwirrt darüber, wie sizeof () funktioniert. Ich verstehe, dass ein Array als Argument an eine Funktion wie

übergeben %Vor%

führt dazu, dass das Array-Argument zu einem Zeiger abfällt. Was ich in den obigen 2 Frage-Links nicht gefunden habe, war eine klare Antwort, warum es so ist, dass die sizeof() -Funktion selbst von diesem Zeigerverfallsverhalten ausgenommen ist (oder zumindest scheinbar davon ausgenommen ist). Wenn sizeof () sich wie jede andere Funktion verhält, dann

%Vor%

Dann sollte das obige 4 anstelle von 20 ausgeben. Habe ich etwas Offensichtliches verpasst, da dies ein Widerspruch zum Verfall zum Zeigerverhalten zu sein scheint ??? Es tut mir leid, dass ich das wieder aufgegriffen habe, aber es fällt mir wirklich schwer zu verstehen, warum das passiert, obwohl ich die Funktion jahrelang gerne benutzt habe, ohne wirklich darüber nachzudenken.

    
mathematician1975 01.07.2012, 15:42
quelle

2 Antworten

15

Weil der Standard das sagt (Betonung meiner):

  

(C99, 6.3.2.1p3) " Außer wenn es der Operand des Operators sizeof oder der unäre & amp; -Operator ist oder ein String-Literal zur Initialisierung eines Arrays verwendet wird, ein Ausdruck, der Der Typ "array of type" wird in einen Ausdruck mit dem Typ "pointer to type" konvertiert, der auf das ursprüngliche Element des Array-Objekts zeigt und kein lvalue ist. "

Beachten Sie, dass der Standard für C ++ explizit besagt, dass die Größe die Größe des Arrays ist:

  

(C ++ 11, 5.3.3p2 sizeof) "[...] Wenn es auf ein Array angewendet wird, ist das Ergebnis die Gesamtzahl der Bytes im Array. Dies bedeutet, dass die Größe eines Arrays von n   elements ist n mal die Größe eines Elements. "

    
ouah 01.07.2012, 15:46
quelle
6

sizeof ist ein Operator, keine Funktion. Es ist auch eine spezifische. Die Klammern sind nicht einmal notwendig, wenn es sich um einen Ausdruck handelt:

%Vor%

Wie Sie sehen, ist es in diesem Diagramm der Priorität . Es ist auch einer der nicht übersteuerbaren Operatoren.

    
chris 01.07.2012 15:43
quelle

Tags und Links