How to Easily Decipher a Complex Pointer Declarations
If you are having problem with deciphering complex pointer declarations like int (*(*foo[10])(void))(int)
then you are at the right place. In this tutorial, you would learn to decipher any complex pointer declarations.
To decipher complex declarations, remember these two simple rules:
-
Always read declarations from the inside out: Start from the innermost, if any, parenthesis. Locate the identifier that's being declared, and start deciphering the declaration from there.
-
When there is a choice, always favor
[]
and()
over*
: If*
precedes the identifier and[]
follows it, the identifier represents an array, not a pointer. Likewise, if*
precedes the identifier and()
follows it, the identifier represents a function, not a pointer. (Parentheses can always be used to override the normal priority of[]
and()
over*
.)
This rule actually involves zigzagging from one side of the identifier to the other.
Now deciphering a simple declaration:
int *a[10];
Applying rule:
int *a[10]; "a is"
^
int *a[10]; "a is an array"
^^^^
int *a[10]; "a is an array of pointers"
^
int *a[10]; "a is an array of pointers to `int`".
^^^
Let's decipher the complex declaration like:
void ( *(*f[]) () ) ();
by applying the above rules:
void ( *(*f[]) () ) (); "f is"
^
void ( *(*f[]) () ) (); "f is an array"
^^
void ( *(*f[]) () ) (); "f is an array of pointers"
^
void ( *(*f[]) () ) (); "f is an array of pointers to function"
^^
void ( *(*f[]) () ) (); "f is an array of pointers to function returning pointer"
^
void ( *(*f[]) () ) (); "f is an array of pointers to function returning pointer to function"
^^
void ( *(*f[]) () ) (); "f is an array of pointers to function returning pointer to function returning `void`"
^^^^
Here is a GIF demonstrating how you go (click at image for larger view):
Sir, Thanks for teaching pattern to read such annoying pointer