最近看到这样一个定义
typedef void (*sighandler_t)(int);
当时没看懂sighandler_t是个啥。
函数指针和指针函数的区别:
区别两者的第一步就是判断谁是主体。指针函数的主体是函数,函数指针的主体是指针。
1.指针函数
这个比较简单,主体是函数,该函数的返回值是一个指针,这样的函数就是指针函数。示例代码如下:
#include<stdio.h> int *fun(int a) { int *ap=&a; return ap; } int main() { int
a=1; printf("%d",fun(a)); return 0; }
运行结果如下 :
2.函数指针
函数指针的主体是一个指针,该指针指向一个函数的首地址。示例代码如下:
#include<stdio.h> int (*p)(void); int sum(void) { return 0; } int main() {
p=sum; printf("%d\n",*p); printf("%d",sum); return 0; }
运行结果如下:
这里解释一下第二行: int (*p)(void);
先说一下优先级,c语言中()和[]的优先级一样高,*的优先级其次。那么p就是我定义的一个int类型指针,这个指针指向一个函数的首地址。函数的类型和指针的类型保持一致,都为int类型。函数的参数为void类型。显然sum()函数就是该函数。让p=sum;就能使p指向sum()函数的首地址。
最开始的问题我们已经解决了一半了。void
(*sighandler_t)(int);的意思就是定义了一个sighandler_t的指针,指针的类型为void,该指针指向一个函数的首地址,该函数的参数为int,函数的类型为void。
理解了指针函数和函数指针后,理解指针数组和数组指针就容易多了。比如: int
(*a[10])[20]的意思就是定义了一个数组a,数组a有十个元素,这十个元素每一个都是一个int型的指针,且每一个指针都指向一个int类型的有20个元素的一维数组的首地址。
现在加上typedef也不难理解。typedef的作用就是自定义一种类型。比如typedef int
a就是定义了类型a,a的类型为int 类型。
那么现在就能解决我们刚开始的问题。typedef void
(*sighandler_t)(int);的意思就是定义了一个sighandler_t的类型,用这个类型定义一个变量,这个变量就是一个函数指针变量,后面的理解就很简单了,不用解释了。但是这里需要注意的是如果这个类型定义的是一个函数,那么这个函数的参数没有限制。