- 
Point 1: Nested functions are not standard C. They are supported as GCC extension..
- 
Point 2: printf("&b is:%s\n",&b);is wrong and invokes UB, because of improper format specifier. You need to change that toprintf("&b is:%p\n",(void *)&b);
- 
Point 3: &(&a)is wrong. the operand for&needs to be an lvalue, not another address, which is not an lvalue.Related: C11, chapterยง6.5.3.2, for the operand typeThe operand of the unary &operator shall be either a function designator, the result of a[]or unary*operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.and the return type ….result is not an lvalue. 
solved No More Confusing Pointers