Let provare questo modo.
prima, è necessario avere familiarità con questi tre simboli:
1. * -- a pointer.
2. [] -- an array.
3.() -- a function.(notice: not parentheses)
prendiamo "doppio (* d()) [n]" come esempio.
il primo passo è trovare l'identificatore nella dichiarazione, un identificatore è il nome della variabile, qui è "d".
(i)
-- what is "d"?
------------------------------------------------------------------------
look to the right side of the identifier, to see if there is a "[]" or a "()" :
...d[]...: d is an array.
...d()...: d is a function.
if neither, look to the left side, to see if there is a "*" :
...*d...: d is a pointer.
------------------------------------------------------------------------
ora abbiamo trovato che d è una funzione. uso x per sostituire d(), allora la dichiarazione diventa "double (* x) [n]"
(ii)
-- what is "x"?
------------------------------------------------------------------------
repeat (i), we find that x is a pointer.
that means, d is a function returning a pointer.
------------------------------------------------------------------------
uso y per sostituire * x, allora la dichiarazione diventa "double y [n]"
(iii)
-- what is "y"?
------------------------------------------------------------------------
repeat (i), we find that y is an array of n elements.
that means, d is a function returning a pointer to an array of n elements.
------------------------------------------------------------------------
uso z per sostituire y [n], allora la dichiarazione diventa "double z"
(iv)
-- what is "z"?
------------------------------------------------------------------------
repeat (i), we find that z is a double.
that means, d is a function returning a pointer to an array of n double elements.
------------------------------------------------------------------------
vediamo un'altra espressione:
void (*(*f)(int)[n])(char)
1.
we find f.
2.
f is a pointer. *f -> a
void (*a(int)[n])(char)
3.
a is a function. a() -> b
void (*b[n])(char)
--f is a pointer to a function (with an int parameter)--
4.
b is an array. b[] -> c
void (*c)(char)
--f is a pointer to a function returning an array (of n elements)--
5.
c is a pointer. *c -> d
void d(char)
--f is a pointer to a function returning an array of n pointers--
6.
d is a function returning void.
--f is a pointer to a function returning an array of n pointers to functions (with a char parameter) returning void--
Go [spirale ....] (http://c-faq.com/decl/spiral.anderson.html) –
Tale nesso è in realtà molto utile, grazie! –
+1 per averlo chiesto Ho avuto la stessa domanda quando stavo esaminando il codice del kernel –