🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!
🌈hello! 各位宝子们大家好啊,数组指针的概念我们学完了那么今天就给大家打来函数指针的讲解! ⛳️函数既然也有自己的地址那么,是不是也可以用指针来存储呢?答案是是的!今天就来看一下函数指针是什么,以及如何应用! 📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!
🔥 注:vs2022 等C语言学习工具都在《学习工具专栏》。 还有各种实用调试技巧有兴趣可以去看看!
函数指针是什么其实很简单?我们依旧可以类比一下
函数既然有地址那么该怎么拿到函数的地址,数组名是数组的地址,&数组可以拿到整个数组的地址!那么函数名是函数的地址嘛?
📚 代码演示:
#include <stdio.h>
void test()
{
printf("hehe");
}
int main()
{
printf("%p\n", &test);
printf("%p\n", test);
return 0;
}
📑 代码结果:
数组指针我们知道他的指针类型是 int (*)[ ] 这样接收的,那么函数指针该怎么样书写呢?假设我们的函数指针类型的
*
表明了他是个指针,是用 pf
接收的函数地址*
表明了他是个指针,是用 pf
接收的数组地址✅总结:
📚 代码演示:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int (*pf)(int, int) = add;
printf("%d\n", add(2, 3));
printf("%d\n", (*pf)(2, 3));
return 0;
}
📑 代码结果:
大家看啊!既然我们是用
pf
接收的函数地址,而函数名本身代表的是函数地址。所以我们可不可以说pf
等于函数名!
📚 代码演示:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int (*pf)(int, int) = add;
printf("%d\n", add(2, 3));
printf("%d\n", pf(2, 3));
return 0;
}
📑 代码结果:
阅读两段有趣的代码:
//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);
其实代码一 (*(void (*)())0)(); 是调用0地址处的函数,
🔥 注:此代码来自于《C的陷阱与缺陷》。
其实这里最难理解的话就是 0
这个数字,这段代码我们只能先从 0
这个数字下手。
16
**进制的整数!16
进制编写的。这时数字 0 就好理解了,我们可以把 0 当成一个地址里面,默认他是个整形。所以那么把地址 0 强制转换为一个函数指针
其实代码二void (*signal(int , void(*)(int)))(int); 可以这样理解,
void(*)(int)
函数指针类型int
类型的参数,返回类型是 void
void
这样看起来这段代码是不是不好理解,那么我们对指针类型重名一下就看的简洁好懂了!
#include <stdio.h>
int main()
{
typedef void(*pf_t)(int);
pf_t signal(int, pf_t);
void (*signal(int, void(*)(int)))(int);
return 0;
}
✅ 归纳:
好了以上就是关于函数指针是什么,如何定义和应用就全部讲解完毕啦!
函数指针是干嘛的?
函数指针的定义
函数指针的应用
函数指针实例
☁️ 把本章的内容全部掌握,铁汁们就可以熟练应用函数指针啦!快去练起来吧!
看到这里了还不给博主扣个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。