In this post I’ll be writing about how to easily read the complicated C declarations like
char (*(*x()) []) () char (* (*x[3]) ()) [5] void (*f)(int,void (*)()) int **(*f)(int**,int**(*)(int **,int **));
Let’s go ahead with the first one
char (*(*x()) []) ()
1. Start from the variable name ——————————-x
2. Go right, find () ———————————————- is a function having no argument
3. Go left, find * ————————————and returns a pointer
4. Nothing to right, but )
5. So go left, nothing to the left but (
4. So go right, find [] ————————————– to an array
5. Go left, find * ———————————————-of pointer
6. Go right, find nothing but )
7. So go left, find nothing but (
8. so go right, find () ———————————–to a function
9. Go left, find char ———————————-returning char
So, declare x as a function returning pointer to an array of pointer to a function returning char.
Now second one:
char (* (*x[3]) ()) [5]
1. Start from variable name ————————– x
2. Go right, find [3] ————————————–is an array of size 3
3. Go left, find * —————————–of pointers
4. Go right , find nothing but )
5. So go left, find nothing but (
6. Go right, find () ———————————— to a function
7. Go left, find * —————————————returning pointer
8. Go right, find nothing but )
9. So go left, find nothing but (
10. So go right, find [5] ————————–to an array of 5
11. Go left , find char —————————–char
So, declare x as an array of 3 pointers to a function returning pointer to an array of 5 char .
But the point is that you have to keep on going to the right: you’re not “alternating right and left”.
Check with a tool
Install cdecl:
sudo apt-get install cdecl
Run it using (on terminal):
cdecl
This will give you:
Type `help' or `?' for help cdecl>
To find English of C gibberish, use:
explain int *x #Press Enter, this will give you #declare x as pointer to int
Check it on the webpage of cdecl.
You can also use this to check a C declaration.
What Linus thinks about the Spiral rule and left right rule, here.