最近看到这样一个定义
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的类型,用这个类型定义一个变量,这个变量就是一个函数指针变量,后面的理解就很简单了,不用解释了。但是这里需要注意的是如果这个类型定义的是一个函数,那么这个函数的参数没有限制。

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信