C語言函數指針數組實現(xiàn)計算器功能
一、概念
數組:一個存放相同類型數據的存儲空間。
int arr[10]; //數組arr的每個元素是int
指針數組:一個存放指針的數組。
int* arr[10]; //數組arr的每個元素是int*
函數指針:一個指向函數的指針,一般用函數名表示。
int Add(int x, int y)
{
return x + y;
}
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[10] = &arr;
//取出數組的地址,p就是指向數組arr的指針,數組中每個元素類型是int,p就是數組指針
//引出函數指針的問題
int (*pf)(int, int) = &Add;
//是一個指向函數的指針 - 存放函數的地址需要注意的是,函數名是函數的地址,&函數名還是函數的地址,在visual stdio編譯環(huán)境下能打印出同一地址。這里的函數指針pf是指向函數Add,其中(int, int)表示函數需要的兩個形參類型是int,函數返回值類型是int。
函數指針數組:一個存放指針的數組,其中的指針都指向各自的函數。
//函數指針
int (*p)(int, int) = Add;
int (*p)(int, int) = Sub;
//Add和Sub是函數名,需要傳入的兩個形參和返回值類型都是int
//將上面兩個同類型的函數指針放入數組中,得到函數指針數組
int (* arr[2]) (int, int) = {Add, Sub};二、用途
函數指針數組的用途:轉移表
三、案例:計算器
(1)基礎代碼編譯:
#include <stdio.h>
//實現(xiàn)加減乘除
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int sub(int a, int b)
{
return a * b;
}
int sub(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf( "***************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "***************************\n" );
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("輸入操作數: ");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("輸入操作數: ");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("輸入操作數: ");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("輸入操作數: ");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("退出程序\n");
break;
}
} while (input);
return 0;
} 這里用到的switch循環(huán)語句,實現(xiàn)了數據的輸入、輸出和函數調用,結構與功能簡單易懂,但主函數中代碼太過冗長,重復的代碼很多,這樣的結構導致后期拓展函數功能需改動的地方非常多。
(2)使用函數指針數組的實現(xiàn):
#include <stdio.h>
//實現(xiàn)加減乘除
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int sub(int a, int b)
{
return a * b;
}
int sub(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int (*p[5])(int x, int y) = { 0, add, sub, mul, div };//轉移表
while (input)
{
printf( "***************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "***************************\n" );
printf("請選擇:");
scanf("%d", &input);
if ((input <= 4 && input >= 1))
{
printf("輸入操作數: ");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
{
printf( "輸入有誤\n" );
printf( "ret = %d\n", ret );
}
return 0;
}
敲重點?。。?nbsp; 敲重點?。?! 敲重點?。?!
這里我們看到函數指針數組的用法是:數組內容(函數指針)解引用得到函數地址,接著傳入參數,進行函數調用,結果返回一個整形(int)數據由ret接收。
ret = (*p[input])(x, y);
在代碼中若出現(xiàn)許多函數同返回值類型,同參數類型時,使用函數指針數組是一個能大大簡化代碼,消除重復代碼,是結構更加輕易易懂,為后期拓展更多功能函數提供便利。
到此這篇關于C語言函數指針數組實現(xiàn)計算器功能的文章就介紹到這了,更多相關C語言 計算器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++通過ofstream和ifstream實現(xiàn)文件讀寫
本文詳細介紹了C++中通過ofstream和ifstream進行文件的讀寫操作,包括文件打開模式的選擇、錯誤處理策略以及二進制文件的特殊處理,重點講解了如何使用這些類進行文本和二進制文件的讀寫,并強調了正確處理文件操作中可能出現(xiàn)的錯誤,需要的朋友可以參考下2025-03-03

