C語言超詳細(xì)講解函數(shù)指針的運(yùn)用
前言
前面我們學(xué)習(xí)了各種各樣的指針類型,有些指針可以說是稀奇百怪,特別是函數(shù)指針,有些朋友可能覺得,函數(shù)指針有些多余,調(diào)用函數(shù)為什么要用指針調(diào)用,直接調(diào)用不好嗎?
接下來我們從具體的實(shí)例來回答同學(xué)們的問題,加深對(duì)函數(shù)指針的理解。
計(jì)算器的例子
接下來我們寫一個(gè)簡(jiǎn)單的計(jì)算器程序,完成不同的計(jì)算功能比如加減乘除:
#include <stdio.h> //相加函數(shù) int add(int a, int b) { return a + b; } //相減函數(shù) int sub(int a, int b) { return a - b; } //相乘函數(shù) int mul(int a, int b) { return a * b; } //相除函數(shù) int div(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("請(qǐng)選擇:"); 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("選擇錯(cuò)誤\n"); break; } } while (input); return 0; }
我們很明顯地感覺到,是不是代碼實(shí)在是有些繁瑣,不同的功能之間有著高度的相似性,比如說進(jìn)去之后都需要對(duì)x和y賦值,最后又都需要打印一個(gè)返回值,但在當(dāng)前的框架下似乎又很難進(jìn)行簡(jiǎn)化。
這時(shí),我們就進(jìn)入了今天的主題,如何使用函數(shù)指針來給程序瘦瘦身。
回調(diào)函數(shù)
我們先來看看使用回調(diào)函數(shù)修改之后的程序。
首先我們?cè)谠瓉淼幕A(chǔ)上構(gòu)造了一個(gè)新的函數(shù),函數(shù)的形參就是一個(gè)函數(shù)指針的形式:
//使用回調(diào)函數(shù) void cumulate_numbers(int (*cumulate)(int, int)) { int x, y; int ret = 0; printf("輸入操作數(shù):"); scanf("%d %d", &x, &y); ret = cumulate(x, y); printf("ret = %d\n", ret); }
然后我們來看看調(diào)用函數(shù)方面有什么改變:
scanf("%d", &input); switch (input) { case 1: cumulate_numbers(add); break; case 2: cumulate_numbers(sub); break; case 3: cumulate_numbers(mul); break; case 4: cumulate_numbers(div); break; case 0: printf("退出程序\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input);
我們可以清楚地認(rèn)識(shí)到每次實(shí)現(xiàn)功能,通過函數(shù)指針使一開始的
printf("輸入操作數(shù):"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret);
轉(zhuǎn)變?yōu)橹灰{(diào)用一個(gè)函數(shù),一行代碼就搞定了。我們這些功能比較簡(jiǎn)單,功能的數(shù)量也不多,使四行代碼變成了一行,如果功能復(fù)雜一些,功能的數(shù)量再多一些,對(duì)于代碼的簡(jiǎn)化量還是非常可觀的。
那么接下來能否讓我們更進(jìn)一步呢?
轉(zhuǎn)移表
我們?cè)賮砜纯锤雍?jiǎn)潔的代碼:
int (*p[5])(int, int) = { 0, add, sub, mul, div }; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("請(qǐng)選擇:"); scanf("%d", &input); if ((input <= 4 && input >= 1)) { printf("輸入操作數(shù):"); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); printf("ret = %d\n", ret); } else if(input != 0) printf("輸入有誤\n"); } while (input);
運(yùn)用了指針數(shù)組,這個(gè)方法叫做轉(zhuǎn)移表。
到此這篇關(guān)于C語言超詳細(xì)講解函數(shù)指針的運(yùn)用的文章就介紹到這了,更多相關(guān)C語言函數(shù)指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV利用霍夫變換實(shí)現(xiàn)交通車道線檢測(cè)
經(jīng)典霍夫變換用來檢測(cè)圖像中的直線,后來霍夫變換經(jīng)過擴(kuò)展可以進(jìn)行任意形狀物體的識(shí)別,例如圓和橢圓。本文就來利用霍夫變換實(shí)現(xiàn)交通車道線檢測(cè),需要的可以參考一下2022-09-09C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07