Was ist der Unterschied zwischen den folgenden Erklärungen?
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
Was ist die allgemeine Regel für das Verständnis komplexerer Erklärungen?
Was ist der Unterschied zwischen den folgenden Erklärungen?
int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);
Was ist die allgemeine Regel für das Verständnis komplexerer Erklärungen?
Als Faustregel gilt, dass rechte unäre Operatoren (wie []
, ()
usw.) haben Vorrang vor den linken. Also, int *(*ptr)()[];
wäre ein Zeiger, der auf eine Funktion zeigt, die ein Array von Zeigern auf int zurückgibt (holen Sie sich die richtigen Operatoren so schnell wie möglich, wenn Sie aus der Klammer kommen)
Ich denke, wir können die einfache Regel anwenden
example int * (*ptr)()[];
start from ptr
" ptr
ist ein Zeiger auf " geh nach rechts ..sein ")" jetzt geh nach links sein "(" komm raus geh nach rechts "()" also " auf eine Funktion, die keine Argumente annimmt " nach links gehen "und einen Zeiger zurückgibt " nach rechts gehen "auf ein Array" nach links gehen " von ganzen Zahlen "
Ich interpretiere sie folgendermaßen:
int *something[n];
Hinweis zum Vorrang: Array-Tiefstellungsoperator (
[]
) hat höhere Priorität als Dereferenz-Operator (*
).
Hier werden wir also die []
vor *
was der Aussage entspricht:
int *(something[i]);
Hinweis auf die Sinnhaftigkeit einer Erklärung:
int num
bedeutetnum
es unint
,int *ptr
ouint (*ptr)
bedeutet, (Wert beiptr
) ist eineint
das machtptr
einen Zeiger aufint
.
Dies kann so gelesen werden, dass (Wert des (Wert am i-ten Index des Etwas)) eine ganze Zahl ist. Also, (Wert am i-ten Index von etwas) ist ein (Ganzzahl-Zeiger), was das Etwas zu einem Array von Ganzzahl-Zeigern macht.
In der zweiten,
int (*something)[n];
Um diese Aussage zu verstehen, müssen Sie mit dieser Tatsache vertraut sein:
Hinweis zur Zeigerdarstellung von Arrays:
somethingElse[i]
ist gleichbedeutend mit*(somethingElse + i)
Ersetzen Sie also somethingElse
con (*something)
erhalten wir *(*something + i)
die laut Deklaration eine ganze Zahl ist. Also, (*something)
ein Array gegeben, das etwas Äquivalentes darstellt zu (Zeiger auf ein Array) .
Hier ist eine interessante Website, die erklärt, wie man komplexe Typen in C liest: http://www.unixwiz.net/techtips/reading-cdecl.html
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.