廢話不多說,直接上代碼(想要看解析往下拉)(記得點贊呦~~~)
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
int main()
{
int a = 0;
int (*output[4])(int, int) = { add,sub,mul,div };
printf("是否進入四則運算模式\n");
printf("*****1 是*****\n");
printf("*****0 否*****\n");
scanf("%d", &a);
int b = 0;
int c = 0;
int d = 0;
while (a)
{
printf("**************************\n");
printf("*1 add**********2 sub***\n");
printf("*3 mul**********4 div***\n");
printf("**************************\n");
printf("請選擇\n");
scanf("%d", &b);
printf("請輸入計算的兩個值\n");
scanf("%d%d", &c, &d);
int e = 0;
e = (output[b - 1])(c, d);
printf("%d\n", e);
printf("是否繼續\n");
printf("*****1 是*****\n");
printf("*****0 否*****\n");
scanf("%d", &a);
}
return 0;
}
其實整個代碼塊并不算多難了解,有興趣的可以看看我寫的掃雷(比這稍微複雜點,但與比賽相比差遠了)。它的思路很簡單,就是構造一個函數指針數組,然後把4個函數放到裡面去,再在想用的時候把它調用出來。
是以說,問題的關鍵在于了解這個函數指針數組。即這個東西: int (*output[4])(int, int) = { add,sub,mul,div }; 當然這東西對于大佬來說很簡單啦~
實際上,由它的名字,函數指針數組,它是一個數組(中心語也就是主語,是數組),是以,在這個數組裡,有四個函數的位址,分别是add,sub,mul,sub,注意是這四個函數的位址,由指針去接受,也就形成了函數指針數組這麼個說法。說白了,它就是一個數組,數組的元素是函數的位址罷了。
這樣,我們就可以根據所輸入的數,用數組下标對其進行通路,進而實作不同種的算法。
值得指出的是,在調用函數的過程中
e = (output[b - 1])(c, d);-----------這麼寫是對的
e = (*output[b - 1])(c, d);-----------這麼寫也是對的
不信你可以試試。
理由很簡單,函數本身就可以表示一種位址
就好像
printf("%d\n",(*pa)(2,3)); 和 printf("%d\n", pa(2, 3)); 都是對的
printf("%d\n",add); 和 printf("%d\n,&add);也都是對的
還是那句話,
不信,你可以試試。
覺着說的有理就高擡貴手,點個小贊吧~~~~~~~~~