C语言学习第26篇---函数与指针分析 回调函数
【摘要】
知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取
函数类型的概念
1.C语言函数也是有类型的
2.函数类型由函数返回值,参数类型,参数个数共同决定
int add(int i,int...
知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取
函数类型的概念
1.C语言函数也是有类型的
2.函数类型由函数返回值,参数类型,参数个数共同决定
int add(int i,int j) 的类型是 int(int , int)
3.C语言中通过typedef为函数重命名
typedef type name(parameter list)
例:
typedef int f(int , int);
typedef void p(int);
引出一个问题:为什么要定义函数指针,直接使用函数名不是挺好的?
如何使用C语言直接跳转到某个固定地址开始执行?(面试题)
根据以下实验,当然可以,根据函数指针就可以
实例1:函数指针的使用
-
#include <stdio.h>
-
typedef int(FUNC)(int); //定义函数类型
-
int test(int i)
-
{
-
return i * i;
-
}
-
void f()
-
{
-
printf("Call f()...\n");
-
}
-
int main()
-
{
-
FUNC* pt = test; //就是int型,直接使用test函数进行初始化,是合法的,相当于使用函数的入口地址
-
void(*pf)() = &f; //函数跟数组不同的是,取不取地址都是入口地址
-
-
printf("pf = %p\n", pf);
-
printf("f = %p\n", f);
-
printf("&f = %p\n", &f);
-
-
pf(); //直接使用函数
-
-
(*pf)(); //取地址,其实是等价于f();
-
-
printf("Function pointer call: %d\n", pt(2));
-
-
return 0;
-
}
回调函数
1.回调函数是利用函数指针实现的一种调用机制
2.回调机制原理
- -调用者不知道具体时间发生时需要调用的具体函数
- -被调函数不知道何时被调用,只知道需要完成的任务
- -当具体事件发生时,调用者通过函数指针调用具体函数
3.回调机制中的调用者和被调用函数互不依赖
实验2:
-
#include <stdio.h>
-
-
typedef int(*Weapon)(int);
-
-
void fight(Weapon wp, int arg)
-
{
-
int result = 0;
-
-
printf("Fight boss!\n");
-
-
result = wp(arg);
-
-
printf("Boss loss: %d\n", result);
-
}
-
-
int knife(int n)
-
{
-
int ret = 0;
-
int i = 0;
-
-
for(i=0; i<n; i++)
-
{
-
printf("Knife attack: %d\n", 1);
-
ret++;
-
}
-
-
return ret;
-
}
-
-
int sword(int n)
-
{
-
int ret = 0;
-
int i = 0;
-
-
for(i=0; i<n; i++)
-
{
-
printf("Sword attack: %d\n", 5);
-
ret += 5;
-
}
-
-
return ret;
-
}
-
-
int gun(int n)
-
{
-
int ret = 0;
-
int i = 0;
-
-
for(i=0; i<n; i++)
-
{
-
printf("Gun attack: %d\n", 10);
-
ret += 10;
-
}
-
-
return ret;
-
}
-
-
int main()
-
{
-
fight(knife, 3);
-
fight(sword, 4);
-
fight(gun, 5);
-
-
return 0;
-
}
-
小结:
1.C语言中的函数都有特定的类型
2.可以使用类型的定义函数指针
3.函数指针是实现回调函数机制的关键技术
4.通过函数指针可以在C程序中实现固定的地址跳转
文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。
原文链接:allen5g.blog.csdn.net/article/details/89112306
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)