看了书中讲复杂类型声明,颇为复杂,C语言在这点上够折腾人的,虽然方便了编译器。这里把它梳理一遍。
我们把声明的类型与表达式分开看
1.int a;
a这个表达式的值是整型
2.int array[N];
array[N]这个表达式的值是整型的,说明array是整型数组。
3.int *pA;
这里 *pA 表达式的值是整型,pA是指针。
4.int fun(int x, int y) ;
这里fun(int x, int y)表达式的值是整型,fun是函数。
5.int (*func)(int *p);
(*func)(int *p)的值是整型,那*func就是函数,所以func就是指向函数的指针了。
6.int (*func[5])(int *p);
*func[5]函数数组,返回值是整型,那么数组中的元素就是指向函数的指针了。
7.int (*(*func)[5])(int *p);
(*(*func)[5])表示函数数组,那么(*func)数组中的元素就是指向函数的指针了,所以func就是指向这个数组首地址的指针,这个数组中的元素都是指向函数的指针。
8.int (*(*func)(int *p))[5];
( *(*func)(int *p))[5]
是整型数组, 那么(func)(int *p)就是指向这个整型数组的指针,说明*func(int p)的返回值是一个指针,所以func是一个函数指针。
总结一下:func是函数指针,它所指向的函数返回值是一个指针,这个指针指向一个整型数组。
具体细节参考《The c programming language》中dcl,与dirdcl函数内容