你知道 下面这个东西指什么吗?
char * const *(*next)();
说起来,c语言真的太容易出现各种莫名其妙(不能明白其中的奥妙)的东西了。
看下面这个东西
上面的就应该被理解为 next是一个函数指针,它返回一个指针,它指向一个类型为char的常量指针。
有下面这些例子
- 高级声明
- 看个例子 int *a; 它把*a声明为一个整数,由此推断出a是一个指向整数的指针。所以 int *f,g;只有f是指针,g是整型。
- int *f(); f是一个返回指向int类型指针的函数,而 int (*f)(); 第二个括号是函数操作调用符,第一对括号只起到了聚组的作用,它迫使间接访问在函数调用之前进行,使f成为了一个函数指针,它所指向的函数用于返回一个整数值。
- int *(*f)(); 这个就容易理解了,f是一个指向返回值是一个int类型的指针的函数的指针。
- int *f[ ]; []的优先级比*的优先级要高,所以f是一个数组,然后类型是int指针。
- int f()[] f是一个函数,返回值为整型数组(非法,c语言函数无法返回数组)
- int f[]() f是一个函数的数组 非法(函数无法统一长度,所以不可能成为数组)
- int (*f[])(); f首先是一个数组,然后f的元素是int型的指针,然后()又说明它势函数,所以f是一个函数指针的数组,返回的值是一个整数值
- int *(*f[])(); f是返回int指针的函数的指针数组..(1 f是数组,f是指针数组,f是函数指针数组,f是返回值为int指针的函数指针数组
巧用typedef
先看一个有点可怕的东西
void (*signal(int sig, void(*func)(int)))(int);
哈哈,反正我看到的时候是一脸懵逼。
signal是一个函数,返回值是一个指向返回值为void,参数为int的函数指针。
signal的第二个参数,void(*func)(int) 表示一个函数指针,返回值为void,接受一个int参数。
用typedef来简化
typedef void(*ptr_to_func) (int);
/**
*它定义ptr_to_func为一个函数指针
**/
ptr_to_func signal(int, ptr_to_func);
/**
*表示signal是一个函数,接受另外两个参数,返回一个函数指针
**/