国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語(yǔ)言】——指針五:轉(zhuǎn)移表與回調(diào)函數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了【C語(yǔ)言】——指針五:轉(zhuǎn)移表與回調(diào)函數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、轉(zhuǎn)移表

1.1、轉(zhuǎn)移表的定義

??
??在之前的學(xué)習(xí)中,我們學(xué)習(xí)了函數(shù)指針數(shù)組(詳情請(qǐng)看【C語(yǔ)言】——指針?biāo)模鹤址羔樑c函數(shù)指針變量),在最后。我曾問(wèn)到:函數(shù)指針數(shù)組有什么用呢?別急,本文給大家細(xì)細(xì)道來(lái)。
??
??函數(shù)指針數(shù)組常常被用在轉(zhuǎn)移表中,那轉(zhuǎn)移表是什么呢?
??
??轉(zhuǎn)移表是一種數(shù)據(jù)結(jié)構(gòu),他用于根據(jù)輸入值來(lái)確定需要執(zhí)行的函數(shù)或操作,轉(zhuǎn)移表通常是一個(gè)包含指針的數(shù)組,數(shù)組中每個(gè)元素包含著指向?qū)?yīng)函數(shù)或操作的指針,通過(guò)查找對(duì)應(yīng)的輸入值進(jìn)行索引,程序可以調(diào)用對(duì)應(yīng)位置的函數(shù)或操作,從而實(shí)現(xiàn)通過(guò)輸入值動(dòng)態(tài)調(diào)度程序執(zhí)行不同的功能。
??
圖示:

【C語(yǔ)言】——指針五:轉(zhuǎn)移表與回調(diào)函數(shù),C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,學(xué)習(xí),算法,數(shù)據(jù)結(jié)構(gòu)

??
??轉(zhuǎn)移表的使用可以避免冗長(zhǎng)的 i f ? e l s e if-else if?else 語(yǔ)句或 s w i t c h switch switch 語(yǔ)句,有效提高代碼的可讀性和維護(hù)性。通過(guò)利用轉(zhuǎn)移表,程序可以根據(jù)輸入值在常量時(shí)間內(nèi)找到對(duì)應(yīng)的操作或函數(shù),并進(jìn)行執(zhí)行,而不需要逐個(gè)判斷條件。轉(zhuǎn)移表在實(shí)現(xiàn)分支邏輯較多、需要快速查找執(zhí)行路徑的情況下非常有用。
??
??不知道你懂了嗎?如果此時(shí)的你還有點(diǎn)懵,我們舉一些生活中的例子來(lái)加深理解吧。

  • 比如我們?nèi)ゲ蛷d吃飯,點(diǎn)菜時(shí)菜單就像是一個(gè)轉(zhuǎn)移表,菜單上的每個(gè)菜,可看成轉(zhuǎn)移表中的函數(shù)指針,每道菜對(duì)應(yīng)這一個(gè)價(jià)格和烹飪方法,即函數(shù)定義。當(dāng)我們選擇后,餐廳通知廚師開(kāi)始烹飪,即執(zhí)行相關(guān)函數(shù)??偨Y(jié)下來(lái),即:菜單就是轉(zhuǎn)移表,通過(guò)菜名(輸入值)來(lái)決定具體的烹飪操作(函數(shù))。
    ??
  • 另外,想象你玩一個(gè)游戲,根據(jù)不同的按鍵操作進(jìn)行不同的動(dòng)作,比如按下"A"鍵跳躍、按下"B"鍵攻擊。游戲中的按鍵映射就可以看作是一個(gè)轉(zhuǎn)移表,根據(jù)玩家的操作(輸入值)執(zhí)行相應(yīng)的游戲動(dòng)作(函數(shù))。

??

1.2、簡(jiǎn)易計(jì)算器的一般實(shí)現(xiàn)

??
下面,我們來(lái)用一般方法來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器:

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

void menu()
{
	printf("***************************\n");
	printf("***  1: Add     2: Sub  ***\n");
	printf("***  3: Mul     4: Div  ***\n");
	printf("***        0: exit      ***\n");
	printf("***************************\n");
}

int main()
{
	int x = 0, y = 0;
	int input = 0;
	int ret = 0;
	do
	{
		menu();
		printf("請(qǐng)選擇:");
		scanf("%d", &input);
		

		switch (input)
		{

		case 1:
			printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("運(yùn)算結(jié)果是:%d\n", ret);
			break;

		case 2:
			printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("運(yùn)算結(jié)果是:%d\n", ret);
			break;

		case 3:
			printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("運(yùn)算結(jié)果是:%d\n", ret);
			break;

		case 4:
			printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("運(yùn)算結(jié)果是:%d\n", ret);
			break;

		case 0:
			printf("退出計(jì)算器\n");
			break;

		default:
			printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");
			break;

		}
	} while (input);

	return 0;
}

??

1.3、用轉(zhuǎn)移表實(shí)現(xiàn)簡(jiǎn)易計(jì)算器

??
??雖然上述代碼用 s w i t c h switch switch 語(yǔ)句實(shí)現(xiàn)了簡(jiǎn)易的計(jì)算器,但是可以發(fā)現(xiàn),這段代碼有許多重復(fù)的語(yǔ)句,太過(guò)冗余。那可以怎么改進(jìn)呢?這時(shí),我們就可以用函數(shù)指針數(shù)組實(shí)現(xiàn)一個(gè)轉(zhuǎn)移表了。
??

int(*p[5])(int, int) = { 0,Add,Sub, Mul,Div };

??

??這里,我們創(chuàng)建一個(gè)函數(shù)指針數(shù)組作為轉(zhuǎn)移表
??
??因?yàn)閿?shù)組的下標(biāo)是從 0 開(kāi)始的,因此我們的首位放置 0,往后各位置放置相應(yīng)函數(shù)地址函數(shù)名就是函數(shù)地址),以便與前面的選擇菜單一一對(duì)應(yīng)

??

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

void menu()
{
	printf("***************************\n");
	printf("***  1: Add     2: Sub  ***\n");
	printf("***  3: Mul     4: Div  ***\n");
	printf("***        0: exit      ***\n");
	printf("***************************\n");
}

int main()
{
	int x = 0, y = 0;
	int input = 0;
	int ret = 0;

	int(*p[5])(int, int) = { 0,Add,Sub, Mul,Div };

	do
	{
		menu();

		printf("請(qǐng)選擇:");
		scanf("%d", &input);


		if(input <= 4 && input >= 1)
		{
			printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
			scanf("%d %d", &x, &y);
			int ret = p[input](x, y); 
			printf("運(yùn)算結(jié)果是:%d\n", ret);
		}

		else if(0 == input)
		{
			printf("退出計(jì)算器\n");
		}

		else
		{
			printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");
		}

	} while (input);

	return 0;
}

??
??

二、回調(diào)函數(shù)

??

2.1、回調(diào)函數(shù)的定義

??
??這里呢,介紹一個(gè)新概念,回調(diào)函數(shù)。
??
??回調(diào)函數(shù)是什么?回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。
??
??如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),被調(diào)用的函數(shù)就是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的條件下,由另一方進(jìn)行調(diào)用,用于對(duì)該條件或事件的響應(yīng)。
??
我們通過(guò)簡(jiǎn)單的例子來(lái)理解一下:

#include<stdio.h>

void test1()
{
	printf("hello world\n");
}

void test2(void (*p)())
{
	(*p)();
}

int main()
{
	test2(test1);
	return 0;
}

??
??上述代碼中, m a i n main main函數(shù)通過(guò)調(diào)用 t e s t 2 test2 test2 函數(shù)來(lái)調(diào)用 t e s t 1 test1 test1 函數(shù),最終在屏幕上打印出 " h e l l o "hello "hello w o r l d " world" world"。
??

2.2、用回調(diào)函數(shù)實(shí)現(xiàn)簡(jiǎn)易計(jì)算器

??
??了解了回調(diào)函數(shù),那上面的簡(jiǎn)易計(jì)算器也可以通過(guò)回調(diào)函數(shù)來(lái)改進(jìn)啦。
??
??我們發(fā)現(xiàn),第一個(gè)版本的計(jì)算器中,選擇不同的功能時(shí), s w i t c h switch switch 語(yǔ)句太過(guò)冗余,那么我們可不可以將這部分封裝成一個(gè)函數(shù),再通過(guò)這個(gè)函數(shù)來(lái)調(diào)用運(yùn)算函數(shù)呢?
??

【C語(yǔ)言】——指針五:轉(zhuǎn)移表與回調(diào)函數(shù),C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,學(xué)習(xí),算法,數(shù)據(jù)結(jié)構(gòu)

??
我們可以將他們封裝成 c a l c calc calc 函數(shù)

void calc(int(*p)(int, int))
{
	int ret = 0;
	int x = 0, y = 0;
	printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
	scanf("%d %d", &x, &y);
	ret = p(x, y);
    printf("運(yùn)算結(jié)果是:%d\n", ret);
}

??
??這樣,當(dāng)我們進(jìn)行不同的選擇時(shí),只需要將不同的運(yùn)算函數(shù)指針傳給 c a l c calc calc 函數(shù)就行了,省去了大量的重復(fù)代碼。

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

void menu()
{
	printf("***************************\n");
	printf("***  1: Add     2: Sub  ***\n");
	printf("***  3: Mul     4: Div  ***\n");
	printf("***        0: exit      ***\n");
	printf("***************************\n");
}

//calc函數(shù)的定義
void calc(int(*p)(int, int))
{
	int ret = 0;
	int x = 0, y = 0;
	printf("請(qǐng)輸入要計(jì)算的兩個(gè)數(shù):");
	scanf("%d %d", &x, &y);
	ret = p(x, y);
    printf("運(yùn)算結(jié)果是:%d\n", ret);
}

int main()
{

	int input = 0;

	do
	{

		menu();
		printf("請(qǐng)選擇:");
		scanf("%d", &input);


		switch (input)
		{

		case 1:
			calc(Add);//通過(guò)calc函數(shù)調(diào)用Add函數(shù)
			break;

		case 2:
			calc(Sub);//通過(guò)calc函數(shù)調(diào)用Sub函數(shù)
			break;

		case 3:
			calc(Mul);//通過(guò)calc函數(shù)調(diào)用Mul函數(shù)
			break;

		case 4:
			calc(Div);//通過(guò)calc函數(shù)調(diào)用Div函數(shù)
			break;

		case 0:
			printf("退出計(jì)算器\n");
			break;

		default:
			printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");
			break;

		}
	} while (input);

	return 0;
}

??
??
??
??


??好啦,本期關(guān)于轉(zhuǎn)移表與回調(diào)函數(shù)就介紹到這里啦,希望本期博客能對(duì)你有所幫助,同時(shí),如果有錯(cuò)誤的地方請(qǐng)多多指正,讓我們?cè)贑語(yǔ)言的學(xué)習(xí)路上一起進(jìn)步!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-843397.html

到了這里,關(guān)于【C語(yǔ)言】——指針五:轉(zhuǎn)移表與回調(diào)函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 函數(shù)指針和回調(diào)函數(shù) 以及指針函數(shù)

    函數(shù)指針(Function Pointer): 定義: 函數(shù)指針是指向函數(shù)的指針,它存儲(chǔ)了函數(shù)的地址。函數(shù)的二制制代碼存放在內(nèi)存四區(qū)中的代碼段,函數(shù)的地址它在內(nèi)存中的開(kāi)始地址。如果把函數(shù)的地址作為參數(shù),就可以在函數(shù)中靈活的調(diào)用其它函數(shù)。 用途: 函數(shù)指針可以用來(lái)在運(yùn)行

    2024年01月21日
    瀏覽(25)
  • 理解函數(shù)指針和回調(diào)函數(shù)

    理解函數(shù)指針和回調(diào)函數(shù)

    指向函數(shù)的指針。比如: 理解函數(shù)指針的偽代碼 比如,B把自己函數(shù)cbkFunc()的地址告訴A,A在運(yùn)行過(guò)程中執(zhí)行cbkFunc()。則 回調(diào)函數(shù):指B的函數(shù)cbkFunc(); 注冊(cè)回調(diào)函數(shù):指B把函數(shù)cbkFunc()的地址告訴A; 回調(diào):指A在運(yùn)行過(guò)程中執(zhí)行cbkFunc()。 無(wú)頭文件.h 為了方便模塊A和B寫在了一

    2023年04月20日
    瀏覽(21)
  • C/C++面向?qū)ο螅∣OP)編程-回調(diào)函數(shù)詳解(回調(diào)函數(shù)、C/C++異步回調(diào)、函數(shù)指針)

    C/C++面向?qū)ο螅∣OP)編程-回調(diào)函數(shù)詳解(回調(diào)函數(shù)、C/C++異步回調(diào)、函數(shù)指針)

    本文主要介紹回調(diào)函數(shù)的使用,包括函數(shù)指針、異步回調(diào)編程、主要通過(guò)詳細(xì)的例子來(lái)指導(dǎo)在異步編程和事件編程中如何使用回調(diào)函數(shù)來(lái)實(shí)現(xiàn)。 ??個(gè)人簡(jiǎn)介:一個(gè)全棧工程師的升級(jí)之路! ??個(gè)人專欄:C/C++精進(jìn)之路 ??CSDN主頁(yè)?發(fā)狂的小花 ??人生秘訣:學(xué)習(xí)的本質(zhì)就是極致

    2024年02月03日
    瀏覽(23)
  • C生萬(wàn)物 | 剖析函數(shù)指針經(jīng)典應(yīng)用 —— 回調(diào)函數(shù)

    C生萬(wàn)物 | 剖析函數(shù)指針經(jīng)典應(yīng)用 —— 回調(diào)函數(shù)

    不懂函數(shù)指針的老鐵可以先看看這篇文章【指針函數(shù)與函數(shù)指針】,上車,準(zhǔn)備出發(fā)?? 回調(diào)函數(shù)就是一個(gè)通過(guò)【函數(shù)指針】調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。回調(diào)函數(shù)

    2024年02月04日
    瀏覽(19)
  • 【再識(shí)C進(jìn)階2(中)】詳細(xì)介紹指針的進(jìn)階——函數(shù)指針數(shù)組、回調(diào)函數(shù)、qsort函數(shù)

    【再識(shí)C進(jìn)階2(中)】詳細(xì)介紹指針的進(jìn)階——函數(shù)指針數(shù)組、回調(diào)函數(shù)、qsort函數(shù)

    ??作者簡(jiǎn)介: 加油,旭杏,目前大二,正在學(xué)習(xí) C++ , 數(shù)據(jù)結(jié)構(gòu) 等?? ??作者主頁(yè):加油,旭杏的主頁(yè)?? ?本文收錄在:再識(shí)C進(jìn)階的專欄?? ??代碼倉(cāng)庫(kù):旭日東升 1?? ??歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!???? ???????在這一篇博客中,我們要認(rèn)識(shí)并理解 函數(shù)指

    2024年02月09日
    瀏覽(19)
  • 【C進(jìn)階】回調(diào)函數(shù)(指針進(jìn)階2,詳解,小白必看)

    【C進(jìn)階】回調(diào)函數(shù)(指針進(jìn)階2,詳解,小白必看)

    目錄 6. 函數(shù)指針數(shù)組 6.1簡(jiǎn)單計(jì)算器 6.2函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器 7. 指向函數(shù)指針數(shù)組的指針(僅作了解即可) 8.回調(diào)函數(shù) 8.1關(guān)于回調(diào)函數(shù)的理解?編輯 8.1.1用回調(diào)函數(shù)改良簡(jiǎn)單計(jì)算器 8.2qsort庫(kù)函數(shù)的使用 8.2.1冒泡排序 8.2.2qsort的概念 8.3冒泡排序思想實(shí)現(xiàn)qsort ?????????這篇文

    2024年02月14日
    瀏覽(58)
  • C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)

    C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)

    目錄 思維導(dǎo)圖: 回調(diào)函數(shù) qsort函數(shù)介紹 模擬實(shí)現(xiàn)qsort 寫在最后: 什么是回調(diào)函數(shù)? 回調(diào)函數(shù)是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。 將一個(gè)函數(shù)指針作為參數(shù)傳遞給一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用所指向函數(shù)時(shí), 我們就將此稱為回調(diào)函數(shù)。 在舉例之前,我們先學(xué)習(xí)一個(gè)C語(yǔ)言

    2024年02月15日
    瀏覽(18)
  • 【云原生】k8s中Contrainer 生命周期回調(diào)/策略/指針學(xué)習(xí)

    【云原生】k8s中Contrainer 生命周期回調(diào)/策略/指針學(xué)習(xí)

    個(gè)人主頁(yè): 征服bug-CSDN博客 kubernetes專欄: kubernetes_征服bug的博客-CSDN博客? 目錄 1 容器生命周期 2 容器生命周期回調(diào)/事件/鉤子 3 容器重啟策略 4 自定義容器啟動(dòng)命令 5 容器探針 1 容器生命周期 Kubernetes 會(huì)跟蹤 Pod 中每個(gè)容器的狀態(tài),就像它跟蹤 Pod 總體上的階段一樣。 你可

    2024年02月14日
    瀏覽(23)
  • Callback回調(diào)函數(shù)介紹(C語(yǔ)言)

    Callback回調(diào)函數(shù)介紹(C語(yǔ)言)

    目錄 1. 回調(diào)函數(shù)的定義 2. 為什么要用回調(diào)函數(shù) 3. 怎么用回調(diào)函數(shù) 3.1 怎么使用沒(méi)有參數(shù)的回調(diào)函數(shù) 3.2 怎么使用帶參數(shù)的回調(diào)函數(shù) 最近在工作中經(jīng)常用到回調(diào)函數(shù)callback,總結(jié)一下。 先來(lái)看看維基百科對(duì)callback的解釋:In computer programming, a callback is any executable code that is pass

    2024年02月02日
    瀏覽(27)
  • 【C語(yǔ)言】回調(diào)函數(shù)(qsort)與模擬實(shí)現(xiàn)

    【C語(yǔ)言】回調(diào)函數(shù)(qsort)與模擬實(shí)現(xiàn)

    何思何慮,居心當(dāng)如止水;勿取勿忘,為學(xué)當(dāng)如流水。— 出自《格言聯(lián)璧·學(xué)問(wèn)類》 解釋:無(wú)思無(wú)慮,心境應(yīng)當(dāng)平靜如水;不求冒進(jìn)也不忘記,學(xué)業(yè)當(dāng)如流水一般永無(wú)止境。 這篇博客我們將會(huì)理解回調(diào)函數(shù)這個(gè)概念,以及借用qsort幫助理解,并且最終用qsort的思路來(lái)實(shí)現(xiàn)冒泡

    2024年02月16日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包