I wrote a simple program to see how variable is treated internally -
main()
{
int a=10;
printf("%u\n", a);
printf("%u\n", &a);
printf("%u\n", &&a);
}
It gives the error in last statement -
Based on this my interpretation
With most variables variable_name has a meaning other than getting the address of that variable, so you need to use &variable to get the address (where after single reference it is not making sense).
The unary &, when applied to a function, yields a pointer to the function, just like it yields the address of an object when it is applied to an object. For pointers to ordinary functions, it is always redundant because of the implicit function-to-function-pointer conversion.
The unary *, when applied to a function pointer, yields the pointed-to function, just like it yields the pointed-to object when it is applied to an ordinary pointer to an object.