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

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

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

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用Matlab繪制一款專屬進度條

    利用Matlab繪制一款專屬進度條

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

    C++基本用法實踐之智能指針詳解

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

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

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

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

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

    C語言實現(xiàn)學籍管理系統(tǒng)課程設計

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

    C 語言條件運算符詳細講解

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

    帶你了解C++中的sort函數

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

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

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

    C++中的對象數組詳細解析

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

    C++實現(xiàn)LeetCode(67.二進制數相加)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(67.二進制數相加),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07

最新評論