日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:JDSZGLLL ? 更新時間: 2022-08-16 編程語言

前言

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

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

計算器的例子

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

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

轉變為只要調用一個函數,一行代碼就搞定了。我們這些功能比較簡單,功能的數量也不多,使四行代碼變成了一行,如果功能復雜一些,功能的數量再多一些,對于代碼的簡化量還是非常可觀的。

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

轉移表

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

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

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

原文鏈接:https://blog.csdn.net/JDSZGLLL/article/details/125271852

欄目分類
最近更新