Ich habe früher eine Frage gelesen, die aufgrund einer exakten Kopie davon geschlossen wurde.
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
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.
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. "
sizeof
ist ein Operator, keine Funktion. Es ist auch eine spezifische. Die Klammern sind nicht einmal notwendig, wenn es sich um einen Ausdruck handelt:
Wie Sie sehen, ist es in diesem Diagramm der Priorität . Es ist auch einer der nicht übersteuerbaren Operatoren.