函数类型:
函数指针:
面试小问题:
如何使用C语言直接跳转到某个固定的地址开始执行?
函数指针的使用:
1 #include <stdio.h> 2 3 typedef int(FUNC)(int); 4 5 int test(int i) 6 { 7 return i * i; 8 } 9 10 void f() 11 { 12 printf("Call f()... "); 13 } 14 15 int main() 16 { 17 FUNC* pt = test; 18 void(*pf)() = &f; 19 20 printf("pf = %p ", pf); 21 printf("f = %p ", f); 22 printf("&f = %p ", &f); 23 24 pf(); 25 26 (*pf)(); 27 28 printf("Function pointer call: %d ", pt(2)); 29 30 return 0; 31 }
函数名取不取地址,它的意义是相同的,这和数组不一样。
运行结果如下:
知道了函数地址,我们在18行直接给函数名用地址赋值,结果如下:
我们可以得到结论,C语言中可以直接跳转到某个固定的地址执行。
回调函数:
回调函数示例:
1 #include <stdio.h> 2 3 typedef int(*Weapon)(int); 4 5 void fight(Weapon wp, int arg) 6 { 7 int result = 0; 8 9 printf("Fight boss! "); 10 11 result = wp(arg); 12 13 printf("Boss loss: %d ", result); 14 } 15 16 int knife(int n) 17 { 18 int ret = 0; 19 int i = 0; 20 21 for(i=0; i<n; i++) 22 { 23 printf("Knife attack: %d ", 1); 24 ret++; 25 } 26 27 return ret; 28 } 29 30 int sword(int n) 31 { 32 int ret = 0; 33 int i = 0; 34 35 for(i=0; i<n; i++) 36 { 37 printf("Sword attack: %d ", 5); 38 ret += 5; 39 } 40 41 return ret; 42 } 43 44 int gun(int n) 45 { 46 int ret = 0; 47 int i = 0; 48 49 for(i=0; i<n; i++) 50 { 51 printf("Gun attack: %d ", 10); 52 ret += 10; 53 } 54 55 return ret; 56 } 57 58 int main() 59 { 60 fight(knife, 3); 61 fight(sword, 4); 62 fight(gun, 5); 63 64 return 0; 65 }
运行结果如下:
函数指针的关键使用场合就是用来实现回调机制。
小结: