C語言是一門面向過程的語言,而面向過程最大的利器就是函數,今天我們就來研究一下函數指針相關的話題。
1. 函數指針
首先看一個例子。
#include <stdio.h>
#include <stdlib.h>
int add(int x, int y) {
return x + y;
}
int main() {
int a = ;
int b = ;
//
printf("%p\n", add);
printf("%p\n", &add);
system("pause");
return ;
}
運作結果:
由結果我們可以得出一個結論:
函數名也是函數的指針。
但是呢,這不是我們今天要要讨論的函數指針,就像之前我們研究過的數組指針,那數組名也是指向數組的指針,但它卻不是我們要研究的數組指針。而函數名在這裡就相當于數組名。
接下來,我們看一看我們今天要研究的函數指針。
定義一個函數指針
int add(int a, int b)
{
int ret = a + b;
printf("%d\n", ret);
return ret;
}
int main()
{
// 一個名為 p ,參數為兩個 int 的函數指針
int (*p)(int, int);
p = add;
p(, );
return ;
}
其實也挺簡單的,下一個例子。
(*(void(*)()))();
它代表了什麼?
逐一進行分析。
再看一個例子。
void (*signal(int,void(*)(int)))(int)
// 它代表了什麼?
// 答案:
// 傳回類型為 void (*)(int) void類型的參數為int的函數指針
// 函數名為 signal(int ,void(*)(int))
//改造一下
typedef void(*func_p)(int); //func_p是一個類型重命名
func_p signal(int ,func_p);
接下來,我們進階一下,研究一下函數指針的數組和指向函數指針數組的指針,對于函數指針和數組指針不太明白的可以參考一下這篇文章。
C語言指針數組與數組指針
2. 函數指針的數組
函數指針的數組,顧名思義,數組裡存放的元素都是指針,這些指針的類型為函數指針類型。
看下面的示例:
void test(int a,char c);
void test2(int a,char c);
void test3(int a,char c);
// 定義一個函數指針數組,類型為 void(* )(int,char)
void (*p[])(int,char) = {test,test2,test3};
//調用函數指針的數組
p[](,'2');
擁有了函數指針數組,我們可以将它應用到很多的場景下,如下面的例子
使用函數指針數組編寫一個電腦:
//電腦
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
void menu_end(void);
void menu_start(void);
int main()
{
int x = ;
int y = ;
int input = ;
int flag = ;
//轉移表
int (*pfunarr[])(int ,int) = {NULL,add,sub,mul,div};
do
{
menu_start();
scanf("%d",&input); //算法
scanf("%d%d",&x,&y); //數值
printf("result = %d\n",pfunarr[input](x,y));
menu_end();
scanf("%d",&flag); //是否繼續
}while(flag);
return ;
}
3. 指向函數指針數組的指針
這個很簡單,即一個指向 函數指針數組 的指針,我們要注意的是它的指針類型。
void (*(*ptr)[])(int ,char ) = &p
//ptr是一個數組,指向一個數組
// 該數組是一個函數指針數組,每個元素是一個函數指針,
// 指針指向一個傳回類型為void,參數為 int,char 的函數