507 Stimmen

C Zeiger auf Array/Array von Zeigern Disambiguierung

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?

5voto

Byron Formwalt Punkte 51
typedef int (*PointerToIntArray)[];
typedef int *ArrayOfIntPointers[];

3voto

Luis Colorado Punkte 9310

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)

2voto

simal Punkte 21

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 "

2voto

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 bedeutet num es un int , int *ptr ou int (*ptr) bedeutet, (Wert bei ptr ) ist eine int das macht ptr einen Zeiger auf int .

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) .

2voto

Abhishek Jaisingh Punkte 1416

Hier ist eine interessante Website, die erklärt, wie man komplexe Typen in C liest: http://www.unixwiz.net/techtips/reading-cdecl.html

CodeJaeger.com

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.

Powered by:

X