函数指针三种定义与使用方式
创作时间:
作者:
@小白创作中心
函数指针三种定义与使用方式
引用
CSDN
1.
https://blog.csdn.net/weixin_45525272/article/details/118711459
函数指针是C语言中的一个重要概念,它允许我们将函数的入口地址存储在变量中,从而实现动态调用函数的功能。本文将详细介绍函数指针的三种定义方式,并通过具体的代码示例帮助读者理解其使用方法。
函数类型剖析
通过什么来区分两个不同的函数?
一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。
函数三要素: 名称、参数、返回值。(C 语言中的函数有自己特定的类型)
c 语言中通过 typedef 为函数类型重命名:
// f 为函数类型
typedef int f(int, int);
// p 为函数类型
typedef void p(int);
这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。
注意:通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能
通过类型定义一个函数指针指向某一个具体函数,才能调用。
typedef void(p)(int, int);
void my_func(int a, int b)
{
printf("%d %d\n", a, b);
}
void test()
{
p p1;
//p1(10,20); //错误,不能直接调用,只描述了函数类型,但是并没有定义函数体,没有函数体无法调用
p* p2 = my_func;
p2(10, 20); //正确,指向有函数体的函数入口地址
}
函数指针(指向函数的指针)
函数指针定义方式有三种:
- 先定义函数类型,通过类型定义指针
- 先定义函数指针类型,根据类型定义指针变量
- 直接定义函数指针变量
函数指针三种定义方式
假设我们有以下函数:
int my_func(int a, int b) {
printf("ret:%d\n", a + b);
return 0;
}
接下来,我们分别介绍三种定义函数指针的方式:
//1. 先定义函数类型,通过类型定义指针
void test01() {
typedef int(FUNC_TYPE)(int, int);
FUNC_TYPE* f = my_func;
//如何调用?
(*f)(10, 20);
f(10, 20);
}
//2. 定义函数指针类型
void test02() {
typedef int(*FUNC_POINTER)(int, int);
FUNC_POINTER f = my_func;
//如何调用?
(*f)(10, 20);
f(10, 20);
}
//3. 直接定义函数指针变量
void test03() {
int(*f)(int, int) = my_func;
//如何调用?
(*f)(10, 20);
f(10, 20);
}
函数指针和指针函数的区别
- 函数指针是指向函数的指针;
- 指针函数是返回类型为指针的函数;
代码案例
对于函数指针作为函数参数的使用方法,可以参考以下文章:
热门推荐
铁观音与乌龙茶的区别?同宗异曲,各具风华
铁观音与乌龙茶:深度解析两大名茶的五大区别
珍惜友情的名言有哪些?珍藏友谊:那些值得铭记的友情名言!
房屋租赁纠纷中的三个法律问题:预留租金、诉讼时效与强制换锁
中考改革:从“唯分数论”到多元化评价体系
吴国越国与战国七雄:地缘政治与实力较量
三角梅养护全攻略:从土壤到病虫害防治的全方位指南
“考公刷掉的,是影响国运的人”,大学生发现:国考日期大有讲究
不动产权证证书号码在哪里看?与房产证有何区别?
精益生产管理学习记录软件
“我不杀伯仁伯仁却因我而死”:辛弃疾词句的出处、含义与现代启示
“我不杀伯仁,伯仁却因我而死”:一段晋朝权力斗争中的历史典故
蜀国灭亡之迷
小脑萎缩的日常护理怎么做
贾湖刻符——汉字起源的重要线索
巨幕双机3D和IMAX有什么区别?
高血压用药指南:四大注意事项助您科学控压
圆周率的前100位是多少?
低风险高收益:法国情报机构利用开源情报跟踪俄电子战系统
被低估的战场精英-《三国志11》六位无S级适应性却表现卓越的武将
员工离职社保停掉后会影响个人权益吗?
糖尿病患者吃水果的五大注意事项
法乙联赛焦点战:马蒂格迎战拉瓦勒
如何在国内进行外币兑换?这种兑换方式有哪些注意事项?
普洱江城:非遗技艺制茶 赋能茶产业发展
房主无法到场怎么过户?三种过户方式及费用详解
宠物社交解锁线下消费新场景
三角梅为何跌落神坛?三大原因及养护全攻略
肚子饿了才会“咕咕叫”?专家:真不一定
信息流优化师求职指南:打造高效职业发展的第一步