Es ist ein Zufall der C-Syntax, dass Sie es in beide Richtungen schreiben können; jedoch wird es immer als
analysiert
Type (*pointer);
das heißt, ist die *
immer auf die declarator gebunden ist, nicht der Programmtyp. Wenn Sie
schrieb
Type* pointer1, pointer2;
es würde als
Type (*pointer1), pointer2;
so nur Zeiger1 als Zeigertyp würde deklariert werden analysiert werden.
C folgt einem "declaration mimics use" -Paradigma; Die Struktur einer Deklaration sollte den äquivalenten Ausdruck, der im Code verwendet wird, so weit wie möglich nachahmen. Wenn Sie z. B. ein Array mit Zeigern auf int mit dem Namen arr
haben und den Ganzzahlwert abrufen möchten, auf den das i-te Element im Array zeigt, würden Sie das Array subskribieren und das Ergebnis dereferenzieren, das als *arr[i]
geschrieben wird (geparst als *(arr[i])
). Der Typ des Ausdruck*arr[i]
ist int
, so die Erklärung für arr
als
geschrieben
int *arr[N];
Welche Weise ist Recht? Kommt drauf an, wen du fragst. Old C farts gefällt mir gefällt T *p
, weil es widerspiegelt, was tatsächlich in der Grammatik passiert. Viele C++ Programmierer favorisieren T* p
, weil es den Typ betont, der sich in vielen Situationen natürlicher anfühlt (nachdem ich meine eigenen Containertypen geschrieben habe, kann ich den Punkt sehen, obwohl es sich immer noch falsch anfühlt).
Wenn Sie mehrere Zeiger deklarieren möchten, können Sie entweder erklären sie alle explizit, wie zum Beispiel:
T *p1, *p2, *p3;
oder Sie können eine typedef erstellen:
typedef T *tptr;
tptr p1, p2, p3;
obwohl ich persönlich nicht tun empfiehl es; Das Verbergen der Zeiger-Eigenschaft von etwas hinter einem Typdef kann dich beißen, wenn du nicht vorsichtig bist.
mögliche Duplikate von [Zeigerdeklarationen in C++: Platzierung des Sternchens] (http://stackoverflow.com/questions/180401/pointer-declarations-in-cplacement-of-the-asterisk) – Qadi