1.對上一篇的補充內容
typedef int* ptr_t
#define PTR_T int*
這兩種寫法都是可以的
ptr_t p1, p2;
//p1, p2 都是指針變量
PTR_T p3, p4;
//p3 是指針變量, p4是整型變量
為什么p3 是指針變量, p4是整型變量呢?
因為PTR_T 真的被改為了 int*?
在編譯器中是這樣解讀的
替換后int *?p3, p4;中 * 給 p3 用了
2.函數指針數組
int * arr [5];
//arr是指針數組 —— 存放的是指針
如果我們有4個函數的地址,要把函數的地址存到?個數組中,那這個數組就叫函數指針數組,那函數指針的數組如何定義呢?
現在有四組函數,如圖:
定義如下圖代碼所示:
3.函數指針數組的小練習
對上述的代碼進行應用:
4組函數部分不變,對代碼進行如下補充:
運行結果如下:
進行8 , 4 的 4 種函數運算
4.用途:轉移表
函數指針數組的?途:轉移表
首先我們編寫一段簡易的計算器代碼,如下圖所示:
?
?
運行結果如下:
以上是兩個整數的運算,完成的加減乘除運算
但是!
如果要計算其他運算,就要對現在的代碼進行補充 case 的語句會越來越長,那么我們有沒有辦法簡化代碼呢?
如下所示:
函數與菜單部分一樣
修改部分如下所示:
當增加算法時:
增加函數、修改菜單、再在函數指針數組種加入函數名、再修改循環中的數據即可。
本篇文章中所有用到的代碼如下:
#define _CRT_SECURE_NO_WARNINGS 1
#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 (*)(int,int)
//
//int main()
//{
// int (*pf1)(int,int) = Add;
// //pf1是函數指針變量
// int (*pfarr[4])(int, int) = {Add,Sub,Mul,Div};
// //pfarr是函數指針數組
// //8 4
// int i = 0;
// for (i = 0; i < 4; i++)
// {
// int r = pfarr[i](8, 4);
// printf("%d\n", r);
// }
// return 0;
//}//計算器
//完成整數的加減乘除運算//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;
//}
//
//void menu()
//{
// printf("************************************\n");
// printf("*********** 1.add ************\n");
// printf("*********** 2.sub ************\n");
// printf("*********** 3.mul ************\n");
// printf("*********** 4.div ************\n");
// printf("*********** 0.exit ************\n");
// printf("************************************\n");
//}
//
//int main()
//{
// int input = 0;
// int x = 0;
// int y = 0;
// int z = 0;
// do
// {
// menu();
// printf("請選擇:");
// scanf("%d ", &input);
// switch (input)
// {
// case 1:
// printf("請輸入兩個操作數:");
// scanf("%d %d", &x, &y);
// z = Add(x, y);
// printf("%d\n", z);
// break;
// case 2:
// printf("請輸入兩個操作數:");
// scanf("%d %d", &x, &y);
// z = Sub(x, y);
// printf("%d\n", z);
// break;
// case 3:
// printf("請輸入兩個操作數:");
// scanf("%d %d", &x, &y);
// z = Mul(x, y);
// printf("%d\n", z);
// break;
// case 4:
// printf("請輸入兩個操作數:");
// scanf("%d %d", &x, &y);
// z = Div(x, y);
// printf("%d\n", z);
// break;
// case 0:
// printf("退出計算器\n");
// break;
// default:
// printf("選擇錯誤\n");
// break;
// }
// } while (input);
// return 0;
//}//簡化代碼
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;
}void menu()
{printf("************************************\n");printf("*********** 1.add ************\n");printf("*********** 2.sub ************\n");printf("*********** 3.mul ************\n");printf("*********** 4.div ************\n");printf("*********** 0.exit ************\n");printf("************************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int z = 0;//再這里創建一個函數指針的數組//int (*pfArr[4])(int, int) = { Add, Sub, Mul, Div };// 下標: 0 1 2 3//和菜單不匹配int (*pfArr[5])(int, int) = { 0, Add, Sub, Mul, Div };// 下標: 0 1 2 3 4do{menu();printf("請選擇:");scanf("%d ", &input);//3if (input >= 1 && input <= 4){printf("請輸入兩個操作數:");scanf("%d %d", &x, &y);z = pfArr[input](x, y);printf("%d\n", z);}else if (input == 0){printf("退出計算器\n");}else{printf("選擇錯誤\n");}} while (input);return 0;
}