Regel für haarige Erklärungen zu lesen: die linke Kennung finden und arbeitet nach außen , erinnern, dass ()
und []
bind vor *
, so T *a[N]
ist ein Array von Zeigern auf T
, T (*a)[N]
ein Zeiger auf ein Feld von T
ist, ist T *f()
eine Funktion einen Zeiger auf T
zurückkehrt, und T (*f)()
ist ein Zeiger auf eine Funktion, die T zurückgibt. Da ein Funktionsprototyp Parameternamen auslassen kann, sehen Sie unter Umständen T *[N]
oder T (*)()
. Die Bedeutung ist meistens die gleiche , nur so tun, als ob es eine Kennung von 0 Länge ist.
So
p -- p
p[3] -- is a 3-element array
*p[3] -- of pointers
(*p[3]) ( ) -- to functions
(*p[3]) ( (*)()) -- taking a pointer to a function
(*p[3]) ( * (*)()) -- returning a pointer
(*p[3]) (void* (*)()) -- to void
* (*p[3]) (void* (*)()) -- returning a pointer
double* (*p[3]) (void* (*)()); -- to double
Die wichtige Sache weg hier zu nehmen ist, dass Sie p
als Array von ...
, keine Funktion ...
Rückkehr deklarieren.
Wie würde solch ein Biest in der Praxis aussehen? Nun, zuerst brauchen Sie drei Funktionen, auf die Sie zeigen können.Jede dieser Funktionen nimmt einen einzigen Parameter, der ein Zeiger auf eine Funktion zurückgibt einen Zeiger auf void:
double *foo(void *(*)());
double *bar(void *(*)());
double *bletch(void *(*)());
double *(*p[3]) (void *(*)()) = {foo, bar, bletch};
Jede foo
, bar
und bletch
nennen würde die Funktion an sie übergeben und irgendwie einen Zeiger auf double
.
Sie würden wollen, auch eine oder mehr Funktionen definieren, die den Parametertyp für jeden foo
erfüllen, bar
und bletch
:
void *blurga() {...}
also, wenn Sie foo
direkt genannt, können Sie es wie
nennen würden
double *pv;
...
pv = foo(blurga);
So konnten wir einen Anruf wie
double *pv = (*p[0])(blurga);
vorstellen
1 - der Unterschied ist, dass Erklärung im Zusammenhang mit der Funktionsparameter, T a[]
und T a[N]
identisch sind zu T *a
; In allen drei Fällen ist a
ein Zeiger aufT
, kein Array von T
. Beachten Sie, dass dies in einer Funktionsparameterdeklaration nur wahr ist. Somit ist T *[]
identisch mit T **
.
Ich bin froh, in der Java-Welt zu gehen ... –
... im Gegensatz in der C-Welt zu laufen? ;-) –
Oli Charlesworth lieferte eine allgemein nützliche Antwort. Schließ nicht. – DevSolar