详谈C语言函数指针

本文详细解释了函数指针的概念,包括其定义、语法格式、使用示例,以及函数指针的类型重定义。通过实例帮助C语言初学者理解和掌握函数指针的运用。
摘要由CSDN通过智能技术生成

这篇文章主要适合有一定C语言基础且对函数指针理解不太清楚的同学,也同样欢迎大佬或者小白选择性学习和阅读哦!

语法介绍

函数指针就是存放函数地址的指针。每个函数的地址就是它的函数名,或者使用&函数名

函数指针语法格式:

int Add(int x, int y)
{
    return x + y;
}

int (*pf)(int, int)=Add;

先定义一个Add函数,参数和返回类型都是int类型。定义一个存放这个Add函数的函数指针pf*号要和pf这个给指针变量名括起来,表明pf是一个指针,然后再加上跟Add函数同类型的参数和返回值,形参的变量名可有可无。

使用

还是上面的例子:

int Add(int x, int y)
{
	return x + y;
}

int (*pf)(int, int) = Add;

int main()
{
	printf("%d\n", pf(10, 20));
	printf("%d\n", (*pf)(1, 2));
	return 0;
}

这里打印出来的结果是30和3。两种写法都是没有问题的,不过还是更推荐第一种,写起来更简洁。

练习一下

1. 试着理解一下这一行代码

( *(void (*) ())0 )()

这行代码中(void (*) ())是函数指针类型,它是一个无参的、返回类型为void的函数指针类型,放在0的前面就表示把0强制类型转化为函数指针类型,然后对这个指针进行解引用(*)处理,跟最后面的一对括号放在一起就构成里函数中调用,所以这行代码就是进行了一次函数调用。

2.再来一个

void (*signal(int, void (*)(int)))(int);

这行代码signal先与后面的括号结合,这个括号中有两个参数第一个是int、第二个是函数指针类型(参数为int,返回类型是void)。所以signal是一个函数名,后面括号中的就是参数类型,而signal的返回值就是把中间的拿掉剩下的即:void (*)(int),也是一个函数指针类型(参数为int,返回类型是void)。所以这行代码就是signal函数的声明。

函数指针的重定义

在signal这个例子中,void(*)(int)这个函数指针类型用到得比较多,我们就对其进行一个类型重定义,语法如下

typedef void (*pf_vt) (int);

不同于以前的重定义的格式,这个写法是把重定义的类型名写到了类型中间,这个就类似于typedef void (*) (int) pf_vt;当然这种写法是不对的,只是可以理解为这样。

重定义以后signal的那个函数声明就可以简化写成

typedef void (*pf_vt) (int);
pf_vt signal(int, pf_vt);

总结

函数指针在C语言使用中相对较少,所以容易忘记,以上介绍了函数指针的用法,希望能够帮助各位同学有更清楚的理解,等后续我还会写一些指针相关的练习,以帮助理解巩固。

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值