C语言学习第26篇---函数与指针分析,回调函数

(33) 2023-09-28 10:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说C语言学习第26篇---函数与指针分析,回调函数,希望能够帮助你!!!。

原文首发于同名微信公号「Allen5G」,欢迎大家搜索关注,欢迎转发!


函数类型的概念

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()... ");
}
int main()
{
FUNC* pt = test; //就是int型,直接使用test函数进行初始化,是合法的,相当于使用函数的入口地址
void(*pf)() = &f; //函数跟数组不同的是,取不取地址都是入口地址
printf("pf = %p ", pf);
printf("f = %p ", f);
printf("&f = %p ", &f);
pf(); //直接使用函数
(*pf)(); //取地址,其实是等价于f();
printf("Function pointer call: %d ", 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! ");
result = wp(arg);
printf("Boss loss: %d ", result);
}
int knife(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Knife attack: %d ", 1);
ret++;
}
return ret;
}
int sword(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Sword attack: %d ", 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 ", 10);
ret += 10;
}
return ret;
}
int main()
{
fight(knife, 3);
fight(sword, 4);
fight(gun, 5);
return 0;
}

小结:

1.C语言中的函数都有特定的类型

2.可以使用类型的定义函数指针

3.函数指针是实现回调函数机制的关键技术

4.通过函数指针可以在C程序中实现固定的地址跳转

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复