1.函數類型
- C語言中的函數有自己特定的類型
- 函數的類型由返回值,參數類型和參數個數共同決定
- int add(int i, int j) 的類型爲 int (int, int)
- C語言中通過typedef爲函數類型重命名
- typedef type name(parameter list)
2.函數指針
- 函數指針用於指向—個函數
- 函數名是執行函數體的入口地址
- 可通過函數類型定義函數指針: FuncType* pointer;
- 也可以直接定義:type (調用約定 *pointer)(parameter list);
- pointer爲函數指針變量名,type爲所指函數的返回值類型,parameter list爲所指函數的參數類型列表
3.面試小問題
- 如何使用C語言直接跳轉到某個固定的地址開始執行?
4.編程實驗
- 函數指針的使用
#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("Function pointer call: %d\n", pt(2));
return 0;
}
- 運行結果:
- 當修改:void(*pf)() = ( void(*)() )0x400564;,運行結果一樣。
5.回調函數
- 回調函數是利用函數指針實現的一種調用機制
- 回調機制原理
- 調用者不知道具體事件發生時需要調用的具體函數
- 被調函數不知道何時被調用,只知道需要完成的任務
- 當具體事件發生時,調用者通過函數指針調用具體函數
- 回調機制中的調用者和被調函數互不依賴
- 回調函數使用示例
#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;
}
- 運行結果:
6.小結
C語言中的函數都有特定的類型
可以使用函數類型定義函數指針
函數指針是實現回調機制的關鍵技術
通過函數指針可以在C程序中實現固定地址跳轉