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

