- C 语言中的函数都有本身特定的类型
- 函数的类型由返回值,参数类型和参数个数共同决定
int add(int i, int j) 的类型为 int(int, int)
- C 语言中经过 typedef 为函数类型重命名
typedef type name(parameter list)
例面试
typedef int f(int, int); typedef void p(int);
- 函数指针用于指向一个函数
- 函数名是执行函数体的入口地址
- 能够经过函数类型定义函数指针: FuncType* pointer;
也能够直接定义: type (*pointer)(parameter list);函数
- pointer 为函数指针变量名
- type 为所指函数的返回值类型
- parameter list 为所指函数的参数类型列表
- 如何使用 C 语言直接跳转到某个固定的地址开始执行?
经过函数指针完成,使用固定的地址初始化函数函数指针。多用于嵌入式设备开发中。
Test_1.c指针
#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; void (*pf)() = f; printf("pf = %p\n", pf); printf("f = %p\n", f); printf("&f = %p\n", &f); pf(); (*pf)(); printf("Fucntion pointer call: %d\n", pt(2)); return 0; }
输出: pf = 0x8048400 f = 0x8048400 &f = 0x8048400 Call f()... Call f()... Fucntion pointer call: 4 分析: f <==> pf pf() <==> (*pf)()
Test_2.ccode
#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; void (*pf)() = (void(*)())(0x8048400); // pf 由一个固定的内存地址初始化!! printf("pf = %p\n", pf); printf("f = %p\n", f); printf("&f = %p\n", &f); pf(); (*pf)(); printf("Fucntion pointer call: %d\n", pt(2)); return 0; }
输出: pf = 0x8048400 f = 0x8048400 &f = 0x8048400 Call f()... 【跳转到一个固定的地址,成功执行】 Call f()... 【跳转到一个固定的地址,成功执行】 Fucntion pointer call: 4
- 回调函数是利用函数指针实现的一种调用机制
回调机制原理事件
- 调用者不知道具体事件发生时须要调用的具体函数
- 被调函数不知道什么时候被调用,只知道须要完成任务
- 当具体事件发生时,调用者经过函数指针调用具体函数
- 回调机制中的调用者和被调用者互不依赖
#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", 10); ret ++; } return ret; } int gun(int n) { int ret = 0; int i = 0; for(i=0; i<n; i++) { printf("Gun attack: %d\n", 5); ret ++; } return ret; } int main() { fight(knife, 3); fight(sword, 4); fight(gun, 5); return 0; }
输出: Fight boss! Knife attack: 1 Knife attack: 1 Knife attack: 1 Boss loss: 3 Fight boss! Sword attack: 5 Sword attack: 5 Sword attack: 5 Sword attack: 5 Boss loss: 4 Fight boss! Gun attack: 5 Gun attack: 5 Gun attack: 5 Gun attack: 5 Gun attack: 5 Boss loss: 5
- C 语言中的函数都有特定的类型
- 可使用函数类型定义函数指针
- 函数指针是实现回调机制的关键技术
- 经过函数指针能够在 C 程序中实现固定地址跳转
以上内容参考狄泰软件学院系列课程,请你们保护原创!内存