C語言函數(shù)指針數(shù)組實現(xiàn)計算器功能
一、概念
數(shù)組:一個存放相同類型數(shù)據(jù)的存儲空間。
int arr[10]; //數(shù)組arr的每個元素是int
指針數(shù)組:一個存放指針的數(shù)組。
int* arr[10]; //數(shù)組arr的每個元素是int*
函數(shù)指針:一個指向函數(shù)的指針,一般用函數(shù)名表示。
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; //取出數(shù)組的地址,p就是指向數(shù)組arr的指針,數(shù)組中每個元素類型是int,p就是數(shù)組指針 //引出函數(shù)指針的問題 int (*pf)(int, int) = &Add; //是一個指向函數(shù)的指針 - 存放函數(shù)的地址
需要注意的是,函數(shù)名是函數(shù)的地址,&函數(shù)名還是函數(shù)的地址,在visual stdio編譯環(huán)境下能打印出同一地址。這里的函數(shù)指針pf是指向函數(shù)Add,其中(int, int)表示函數(shù)需要的兩個形參類型是int,函數(shù)返回值類型是int。
函數(shù)指針數(shù)組:一個存放指針的數(shù)組,其中的指針都指向各自的函數(shù)。
//函數(shù)指針 int (*p)(int, int) = Add; int (*p)(int, int) = Sub; //Add和Sub是函數(shù)名,需要傳入的兩個形參和返回值類型都是int //將上面兩個同類型的函數(shù)指針放入數(shù)組中,得到函數(shù)指針數(shù)組 int (* arr[2]) (int, int) = {Add, Sub};
二、用途
函數(shù)指針數(shù)組的用途:轉(zhuǎn)移表
三、案例:計算器
(1)基礎(chǔ)代碼編譯:
#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("輸入操作數(shù): "); scanf("%d %d", &x, &y); ret = add(x, y); printf("ret = %d\n", ret); break; case 2: printf("輸入操作數(shù): "); scanf("%d %d", &x, &y); ret = sub(x, y); printf("ret = %d\n", ret); break; case 3: printf("輸入操作數(shù): "); scanf("%d %d", &x, &y); ret = mul(x, y); printf("ret = %d\n", ret); break; case 4: printf("輸入操作數(shù): "); 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)了數(shù)據(jù)的輸入、輸出和函數(shù)調(diào)用,結(jié)構(gòu)與功能簡單易懂,但主函數(shù)中代碼太過冗長,重復(fù)的代碼很多,這樣的結(jié)構(gòu)導(dǎo)致后期拓展函數(shù)功能需改動的地方非常多。
(2)使用函數(shù)指針數(shù)組的實現(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 };//轉(zhuǎn)移表 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("輸入操作數(shù): "); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); } else { printf( "輸入有誤\n" ); printf( "ret = %d\n", ret ); } return 0; }
敲重點?。?! 敲重點?。?! 敲重點?。?!
這里我們看到函數(shù)指針數(shù)組的用法是:數(shù)組內(nèi)容(函數(shù)指針)解引用得到函數(shù)地址,接著傳入?yún)?shù),進(jìn)行函數(shù)調(diào)用,結(jié)果返回一個整形(int)數(shù)據(jù)由ret接收。
ret = (*p[input])(x, y);
在代碼中若出現(xiàn)許多函數(shù)同返回值類型,同參數(shù)類型時,使用函數(shù)指針數(shù)組是一個能大大簡化代碼,消除重復(fù)代碼,是結(jié)構(gòu)更加輕易易懂,為后期拓展更多功能函數(shù)提供便利。
到此這篇關(guān)于C語言函數(shù)指針數(shù)組實現(xiàn)計算器功能的文章就介紹到這了,更多相關(guān)C語言 計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++通過ofstream和ifstream實現(xiàn)文件讀寫
本文詳細(xì)介紹了C++中通過ofstream和ifstream進(jìn)行文件的讀寫操作,包括文件打開模式的選擇、錯誤處理策略以及二進(jìn)制文件的特殊處理,重點講解了如何使用這些類進(jìn)行文本和二進(jìn)制文件的讀寫,并強調(diào)了正確處理文件操作中可能出現(xiàn)的錯誤,需要的朋友可以參考下2025-03-03C語言實現(xiàn)linux網(wǎng)卡檢測改進(jìn)版
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)linux網(wǎng)卡檢測的改進(jìn)版,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06C++實現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07