最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言超詳細講解函數指針的運用

 更新時間:2022年06月23日 10:47:46   作者:JDSZGLLL  
函數指針是一個指針變量,它可以存儲函數的地址,然后使用函數指針,下面這篇文章主要給大家介紹了關于C語言進階教程之函數指針的相關資料,需要的朋友可以參考下

前言

前面我們學習了各種各樣的指針類型,有些指針可以說是稀奇百怪,特別是函數指針,有些朋友可能覺得,函數指針有些多余,調用函數為什么要用指針調用,直接調用不好嗎?

接下來我們從具體的實例來回答同學們的問題,加深對函數指針的理解。

計算器的例子

接下來我們寫一個簡單的計算器程序,完成不同的計算功能比如加減乘除:

#include <stdio.h>
//相加函數
int add(int a, int b)
{
	return a + b;
}
//相減函數
int sub(int a, int b)
{
	return a - b;
}
//相乘函數
int mul(int a, int b)
{
	return a * b;
}
//相除函數
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("輸入操作數:");
			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;
}

我們很明顯地感覺到,是不是代碼實在是有些繁瑣,不同的功能之間有著高度的相似性,比如說進去之后都需要對x和y賦值,最后又都需要打印一個返回值,但在當前的框架下似乎又很難進行簡化。

這時,我們就進入了今天的主題,如何使用函數指針來給程序瘦瘦身。

回調函數

我們先來看看使用回調函數修改之后的程序。

首先我們在原來的基礎上構造了一個新的函數,函數的形參就是一個函數指針的形式:

//使用回調函數
void  cumulate_numbers(int (*cumulate)(int, int))
{
	int x, y;
	int ret = 0;
	printf("輸入操作數:");
	scanf("%d %d", &x, &y);
	ret = cumulate(x, y);
	printf("ret = %d\n", ret);
}

然后我們來看看調用函數方面有什么改變:

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);

我們可以清楚地認識到每次實現功能,通過函數指針使一開始的

printf("輸入操作數:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);

轉變?yōu)橹灰{用一個函數,一行代碼就搞定了。我們這些功能比較簡單,功能的數量也不多,使四行代碼變成了一行,如果功能復雜一些,功能的數量再多一些,對于代碼的簡化量還是非??捎^的。

那么接下來能否讓我們更進一步呢?

轉移表

我們再來看看更加簡潔的代碼:

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("輸入操作數:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if(input != 0)
			printf("輸入有誤\n");
	} while (input);

運用了指針數組,這個方法叫做轉移表。

到此這篇關于C語言超詳細講解函數指針的運用的文章就介紹到這了,更多相關C語言函數指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一道超經典的C++結構體的題目

    一道超經典的C++結構體的題目

    以下小編就為大家介紹一道超經典的關于C++結構體的題目。需要的朋友可以過來參考下
    2013-09-09
  • 手動添加bits/stdc++.h到vs2017的詳細步驟

    手動添加bits/stdc++.h到vs2017的詳細步驟

    這篇文章主要介紹了手動添加bits/stdc++.h到vs2017的詳細步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C語言數據結構之二叉樹詳解

    C語言數據結構之二叉樹詳解

    二叉樹(Binary tree)是樹形結構的一個重要類型。許多實際問題抽象出來的數據結構往往是二叉樹形式。本文將通過示例詳細講解一下二叉樹,需要的可以參考一下
    2022-03-03
  • C++控制權限關鍵字protected

    C++控制權限關鍵字protected

    這篇文章主要介紹了C++控制權限關鍵字protected,protected和private類似,而對于派生類來說,protected與public類似,下面來一起倆姐更多詳細內容吧,需要的小伙伴可以參考一下
    2022-01-01
  • Matlab實現繪制玫瑰線的示例代碼

    Matlab實現繪制玫瑰線的示例代碼

    這篇文章主要為大家介紹了如何利用Matlab繪制3好看的玫瑰線,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,感興趣的小伙伴可以動手試一試
    2022-08-08
  • 淺談C語言=與==的區(qū)別詳解

    淺談C語言=與==的區(qū)別詳解

    這篇文章主要介紹了淺談C語言=與==的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • C++函數指針的用法詳解

    C++函數指針的用法詳解

    這篇文章主要為大家介紹了C++函數指針的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

    2022-01-01
  • C語言中fgets和fscanf區(qū)別詳解

    C語言中fgets和fscanf區(qū)別詳解

    這篇文章主要介紹了C語言中fgets和fscanf區(qū)別詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • 哈夫曼算法構造代碼

    哈夫曼算法構造代碼

    這篇文章主要介紹了哈夫曼算法構造代碼,有需要的朋友可以參考一下
    2013-12-12
  • C語言遞歸函數與漢諾塔問題簡明理解

    C語言遞歸函數與漢諾塔問題簡明理解

    遞歸(recursive)函數是“自己調用自己”的函數,無論是采用直接或間接調用方式。間接遞歸意味著函數調用另一個函數(然后可能又調用第三個函數等),最后又調用第一個函數。因為函數不可以一直不停地調用自己,所以遞歸函數一定具備結束條件
    2022-07-07

最新評論

鹤庆县| 金坛市| 彭山县| 南通市| 忻城县| 昌图县| 茶陵县| 新民市| 治县。| 昂仁县| 兴城市| 古田县| 黑山县| 鄯善县| 扶风县| 维西| 永和县| 汨罗市| 尚志市| 革吉县| 梧州市| 沅江市| 叶城县| 酉阳| 齐河县| 察雅县| 安塞县| 景洪市| 新营市| 弥渡县| 阜南县| 吴桥县| 邮箱| 石家庄市| 尉犁县| 应城市| 宝应县| 天津市| 马尔康县| 全州县| 巢湖市|