Um Ausdrücke und Deklarationen zu verstehen, müssen Sie die Operatorvorgaben kennen. Es gibt viele online, zum Beispiel here.
Auf dieser Seite können Sie sehen, dass spitzen Klammern eine höhere Priorität als die Dereferenzierung Sternchen haben, was bedeutet, dass sie zuerst angewendet werden.Wenn Sie mögen, können Sie Teile der Deklaration mit Klammern klammern, genau wie in einem Ausdruck:
int *(a[10]); // brackets are redundant and show operator precedence
Daher muss die Variable a
ein Array sein. Das Array Element resultierend aus der Indizierung liefert, nachdem der Dereferenzierungsoperator angewendet wird, eine int
, so dass das Element ein Zeiger auf int sein muss.
Daher deklariert die Deklaration ein Array von int-Zeigern.
Als Extra können Sie keinen Zeiger auf ein Array ohne Klammern oder typedefs deklarieren, nur weil die Operator-Präzedenzfälle für den viel häufiger oben genannten Fall gemacht werden. Ein Zeiger auf ein Array würde wie folgt aussehen:
Hier wird zuerst der Sternchen der Dereferenzierung angewendet; a
muss daher ein Zeiger sein. Der resultierende Typ kann indiziert werden, muss also ein Array sein, dessen Elemente int
s sind. Dies macht a
einen Zeiger auf ein Array von int
s.
Stecken Sie es in eine C-Deklaration-> Englisch-Übersetzer: http://cdecl.org/ – user2357112
Es ist ein Array von 3 Zeigern zu 'int': So oder so, rate nicht die Größe, verwenden Sie' sizeof a' . –
Warum sollte ein Array von 3 Zeigern 12 Bytes sein? Was garantiert, dass ein Zeiger 4 Bytes ist? Warum benutze nicht 'sizeof a' und überprüfe das stattdessen? Wenn Sie versuchen zu lernen, dann ist das Wichtigste der Typ der Variablen "a" und seine Größe ist nicht leicht vorhersagbar. –