欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言超詳細(xì)講解函數(shù)指針的運(yùn)用

 更新時(shí)間:2022年06月23日 10:47:46   作者:JDSZGLLL  
函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語言進(jìn)階教程之函數(shù)指針的相關(guā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)文章

  • 利用Matlab繪制一款專屬進(jìn)度條

    利用Matlab繪制一款專屬進(jìn)度條

    MATLAB自帶的進(jìn)度條是很簡(jiǎn)單的,這樣的進(jìn)度條顯得冷冰冰的。因此,本文將用Matlab來DIY一款專屬的進(jìn)度條,感興趣的小伙伴可以了解一下
    2022-02-02
  • C++基本用法實(shí)踐之智能指針詳解

    C++基本用法實(shí)踐之智能指針詳解

    為了減少手動(dòng)管理內(nèi)存帶來的困擾,c++提出了智能指針,可以幫助我們進(jìn)行內(nèi)存管理,下面小編就來和大家簡(jiǎn)單聊聊C++中智能指針的基本用法吧
    2023-07-07
  • OpenCV利用霍夫變換實(shí)現(xiàn)交通車道線檢測(cè)

    OpenCV利用霍夫變換實(shí)現(xiàn)交通車道線檢測(cè)

    經(jīng)典霍夫變換用來檢測(cè)圖像中的直線,后來霍夫變換經(jīng)過擴(kuò)展可以進(jìn)行任意形狀物體的識(shí)別,例如圓和橢圓。本文就來利用霍夫變換實(shí)現(xiàn)交通車道線檢測(cè),需要的可以參考一下
    2022-09-09
  • 解析使用C++編寫無錯(cuò)代碼的方法技巧

    解析使用C++編寫無錯(cuò)代碼的方法技巧

    本篇文章是對(duì)使用C++編寫無錯(cuò)代碼的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C 語言條件運(yùn)算符詳細(xì)講解

    C 語言條件運(yùn)算符詳細(xì)講解

    本文主要介紹C語言中的條件運(yùn)算符,并提供示例代碼以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí) C語言的同學(xué)
    2016-07-07
  • 帶你了解C++中的sort函數(shù)

    帶你了解C++中的sort函數(shù)

    這篇文章主要給大家介紹了關(guān)于C++中sort函數(shù)的基礎(chǔ)入門使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2021-08-08
  • C語言實(shí)現(xiàn)房屋管理系統(tǒng)

    C語言實(shí)現(xiàn)房屋管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)房屋管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中的對(duì)象數(shù)組詳細(xì)解析

    C++中的對(duì)象數(shù)組詳細(xì)解析

    在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。如果有50個(gè)元素,就需要調(diào)用50次構(gòu)造函數(shù)。在需要的時(shí)候,可以在定義數(shù)組時(shí)提供實(shí)參以實(shí)現(xiàn)初始化
    2013-10-10
  • C++實(shí)現(xiàn)LeetCode(67.二進(jìn)制數(shù)相加)

    C++實(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

最新評(píng)論