函數(shù)類型剖析
通過(guò)什么來(lái)區(qū)分兩個(gè)不同的函數(shù)?
一個(gè)函數(shù)在編譯時(shí)被分配一個(gè)入口地址,這個(gè)地址就稱為函數(shù)的指針,函數(shù)名代表函數(shù)的入口地址。
函數(shù)三要素: 名稱、參數(shù)、返回值。(C 語(yǔ)言中的函數(shù)有自己特定的類型)
c 語(yǔ)言中通過(guò) typedef 為函數(shù)類型重命名:
// f 為函數(shù)類型
typedef int f(int, int);
// p 為函數(shù)類型
typedef void p(int);
這一點(diǎn)和數(shù)組一樣,因此我們可以用一個(gè)指針變量來(lái)存放這個(gè)入口地址,然后通過(guò)該指針變量調(diào)用函數(shù)。
注意:通過(guò)函數(shù)類型定義的變量是不能夠直接執(zhí)行,因?yàn)闆](méi)有函數(shù)體。只能
通過(guò)類型定義一個(gè)函數(shù)指針指向某一個(gè)具體函數(shù),才能調(diào)用。
typedef void(p)(int, int);
void my_func(int a, int b)
{
printf("%d %d\n", a, b);
}
void test()
{
p p1;
//p1(10,20); //錯(cuò)誤,不能直接調(diào)用,只描述了函數(shù)類型,但是并沒(méi)有定義函數(shù)體,沒(méi)有函數(shù)體無(wú)法調(diào)用
p* p2 = my_func;
p2(10, 20); //正確,指向有函數(shù)體的函數(shù)入口地址
}
函數(shù)指針(指向函數(shù)的指針)
- 函數(shù)指針定義方式(先定義函數(shù)類型,根據(jù)類型定義指針變量);
- 先定義函數(shù)指針類型,根據(jù)類型定義指針變量;
- 直接定義函數(shù)指針變量;
例如下面my_func函數(shù)
int my_func(int a, int b) {
printf("ret:%d\n", a + b);
return 0;
}
函數(shù)指針三種定義方式
//1. 先定義函數(shù)類型,通過(guò)類型定義指針
void test01() {
typedef int(FUNC_TYPE)(int, int);
FUNC_TYPE* f = my_func;
//如何調(diào)用?
(*f)(10, 20);
f(10, 20);
}
//2. 定義函數(shù)指針類型
void test02() {
typedef int(*FUNC_POINTER)(int, int);
FUNC_POINTER f = my_func;
//如何調(diào)用?
(*f)(10, 20);
f(10, 20);
}
//3. 直接定義函數(shù)指針變量
void test03() {
int(*f)(int, int) = my_func;
//如何調(diào)用?
(*f)(10, 20);
f(10, 20);
}
函數(shù)指針和指針函數(shù)的區(qū)別:
代碼案例
C語(yǔ)言提高:函數(shù)指針做函數(shù)參數(shù):
https://yangyongli.blog.csdn.net/article/details/118710963