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

【C】回調(diào)函數(shù)和qsort詳解

這篇具有很好參考價值的文章主要介紹了【C】回調(diào)函數(shù)和qsort詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

回調(diào)函數(shù)概念

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一
個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該
函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或
條件進行響應。
簡單的來說,回調(diào)函數(shù)就是通過函數(shù)指針調(diào)用的函數(shù)就是回調(diào)函數(shù)。我們庫里面有一個函數(shù)qsort,就用到了回調(diào)函數(shù)。

庫函數(shù)qsort(在頭文件stdlib.h中)

這個函數(shù)是一個排序函數(shù),我們學過冒泡排序,但是那個排序能夠排序整型,我們今天說的qsort可以排序任何類型,它默認排的是升序。我們來看一下他的參數(shù)列表:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

這里的void* 為無類型,因為可以排序任意類型的數(shù)組,所以不知道你的是哪種數(shù)組的指針用void* 來接收,size_t為無符號整型,num表示的是數(shù)組的大小,width為數(shù)組中每個元素多大,最后一個參數(shù)就是函數(shù)指針了,指向的是 int xxxx(const void *elem1, const void *elem2 ) 這樣一個函數(shù)。再看下圖:
【C】回調(diào)函數(shù)和qsort詳解,c語言,java,算法,開發(fā)語言
如果elem1指向的內(nèi)容大于elem2指向的內(nèi)容就返回大于0的數(shù)字,如果等于就返回0,如果小于就返回小于0的數(shù)字。
那么接下來我們就上手來用下這個函數(shù):

// qsort需要的函數(shù)
int sort_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}
// 打印函數(shù)
void print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 5,6,4,8,1,3,2,7,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//計算數(shù)組大小
	qsort(arr, sz, sizeof(arr[0]), sort_int);
	print(arr, sz);
	return 0;
}

運行結(jié)果:

【C】回調(diào)函數(shù)和qsort詳解,c語言,java,算法,開發(fā)語言
需要主要的是,void* 不能直接對它解引用操作,需要先強制類型轉(zhuǎn)換,然后再操作。

qsort模擬實現(xiàn)

因為我們目前就學過冒泡排序,所以今天我們就用冒泡排序來模擬實現(xiàn)qsort.
我們將上面的代碼拿下來,把qsort改為my_qsort.

int sort_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}
// 打印函數(shù)
void print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 5,6,4,8,1,3,2,7,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//計算數(shù)組大小
	my_qsort(arr, sz, sizeof(arr[0]), sort_int);
	print(arr, sz);
	return 0;
}

那現(xiàn)在我們只需要實現(xiàn)my_qsort就可以了,我們這里傳遞的是整型數(shù)組,所以可以用整型指針來接受,但是我們qsort是可以排序任何類型的數(shù)據(jù)的,所以我們要用void* 來接受。所以函數(shù)的參數(shù)列表為:

void my_qsort(void* arr, size_t num, size_t width, int (cmp)(const void, const void*))

我們冒泡排序不管排什么數(shù)據(jù),排的趟數(shù)肯定不會變的,而且每一趟比較的對數(shù)也是固定的,所以我們可以把冒泡排序的大體框架實現(xiàn)出來,這里的函數(shù)指針指向的函數(shù)就可以認為比較兩個元素的大小的函數(shù)。我們的比較函數(shù)需要兩個指針,也就是兩個元素的地址,這時候我們傳過來的元素大小就起到作用了,我們首元素的地址可以認為就是arr,第二個就是arr+1width,又因為只有arr是(char)類型是,我們才能實現(xiàn)每次跳的單位是1,所以我們在這之前要將arr強制轉(zhuǎn)化為(char*)類型因為我們拍的元素是變化的,我們這里將參數(shù)設置為
(char*)arr+j* width,(char*)arr+(j+1)*width,這樣我們就可以實現(xiàn)my_sort了。

void my_qsort(void* arr, size_t num, size_t width, int (*cmp)(const void*, const void*))
{
	for (unsigned int i = 0; i < num - 1; i++)
	{
		for (unsigned int j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)(arr)+j*width,(char*)(arr)+(j+1)*width)>0)
			{
				Swap((char*)(arr) + j * width, (char*)(arr) + (j + 1) * width,width);
			}
		}
	}
}

這里就剩下一個Swap函數(shù)了,這個函數(shù)實現(xiàn)以后,我們的my_qsort就可以正常工作了。
因為我們還是要交換兩個元素,所以我們要將兩個元素的地址傳過去,傳過去的為(char*)類型的所以我們用char* 來接收就可以,又因為char*一次只能訪問一個字節(jié),如果我們要交換整型的話只需要將4個字節(jié)的內(nèi)容都交換就可以了,所以我們還需要講元素的大小過去。

void Swap(char* p1, char* p2, int width)
{
	char tmp = 0;
	for (int i = 0; i < width; i++)
	{
		tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

到這里我們的qsort就實現(xiàn)完成了,我們來看一下運行結(jié)果:
【C】回調(diào)函數(shù)和qsort詳解,c語言,java,算法,開發(fā)語言
我們可以看到我們的排序也沒有問題。

今天的分享就到這里結(jié)束了,感謝大家的關(guān)注和支持!文章來源地址http://www.zghlxwxcb.cn/news/detail-544575.html

到了這里,關(guān)于【C】回調(diào)函數(shù)和qsort詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • C語言——qsort函數(shù)的使用(詳解)

    C語言——qsort函數(shù)的使用(詳解)

    qsort()函數(shù)(quick sort)是八大排序算法中的快速排序,能夠排序任意數(shù)據(jù)類型的數(shù)組其中包括整形,浮點型,字符串甚至還有自定義的結(jié)構(gòu)體類型。 點擊網(wǎng)站:https://cplusplus.com/reference/——再點擊查看老版本函數(shù)超鏈接口(查看函數(shù)的含義) 老版本 在搜索框輸入要查詢的

    2024年02月14日
    瀏覽(21)
  • C語言 快速排序——qsort函數(shù)詳解

    ? ? ? ? 我們在使用冒泡排序法做題的時候,經(jīng)常會遇到運算次數(shù)過多程序超時的情況,而且冒泡排序法只能對整形數(shù)組進行排序。 ? ? ? ? 為了解決這些問題!就使用 qsort函數(shù) 吧! 目錄 一、qsort函數(shù)使用方法 二、qsort函數(shù)使用示例 ? ? ?1.數(shù)組排序 ? ? ?2.字符數(shù)組排序 ?

    2024年02月03日
    瀏覽(22)
  • 【進階C語言】qsort庫函數(shù)(詳解)

    【進階C語言】qsort庫函數(shù)(詳解)

    qsort是C語言庫函數(shù)里面的一種,包含于#include stdlib.h這個頭文件里面,使用快速排序的方法 qsort英語解析:Quick sort,翻譯就是快速排序,它的內(nèi)部實現(xiàn)是通過的快速排序算法來實現(xiàn)的。 功能:對傳入的任何數(shù)據(jù)進行排序,使其變成有序數(shù)列。 qsort是可以排序任意類型的數(shù)據(jù)

    2024年02月02日
    瀏覽(23)
  • 深入理解回調(diào)函數(shù)qsort:從入門到模擬實現(xiàn)

    深入理解回調(diào)函數(shù)qsort:從入門到模擬實現(xiàn)

    ??博客主頁:江池俊的博客 ?收錄專欄:C語言進階之路 ??專欄推薦:?C語言初階之路 ?數(shù)據(jù)結(jié)構(gòu)探索 ??代碼倉庫:江池俊的代碼倉庫 ??? 社區(qū):GeekHub社區(qū) ? ??歡迎大家點贊??評論??收藏? 回調(diào)函數(shù)和 qsort 是 C語言編程中重要的概念,它們?yōu)槲覀兲峁┝藦姶蟮墓ぞ?/p>

    2024年02月10日
    瀏覽(27)
  • 【C語言】qsort()函數(shù)詳解:能給萬物排序的神奇函數(shù)

    【C語言】qsort()函數(shù)詳解:能給萬物排序的神奇函數(shù)

    ?? 個人主頁 :修修修也 ?? 所屬專欄 :C語言 ?? 操作環(huán)境 : Visual Studio 2022 ? 目錄 一.qsort()函數(shù)的基本信息及功能 二.常見的排序算法及冒泡排序 三.逐一解讀qsort()函數(shù)的參數(shù)及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(const void*,const void*) 四.使用qsort()函數(shù)完成整形,

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

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

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

    2024年02月09日
    瀏覽(19)
  • 從排序算法的藝術(shù)看C語言qsort函數(shù)的魅力:一場數(shù)據(jù)的時空穿越

    從排序算法的藝術(shù)看C語言qsort函數(shù)的魅力:一場數(shù)據(jù)的時空穿越

    歡迎來到白劉的領(lǐng)域? ? Miracle_86.-CSDN博客 系列專欄 ?? C語言知識 先贊后看,已成習慣 ? ?創(chuàng)作不易,多多支持! 目錄 一 、回調(diào)函數(shù) 二、qsort函數(shù) 1.qsort函數(shù)排序整型數(shù)據(jù) 2.qsort函數(shù)排序結(jié)構(gòu)數(shù)據(jù) 何為回調(diào)函數(shù)?聽起來很裝逼的樣子,實際上它是一個很簡單的概念: 回調(diào)函

    2024年03月19日
    瀏覽(26)
  • c語言-qsort函數(shù)

    c語言-qsort函數(shù)

    目錄 一、函數(shù)介紹 二、qsort函數(shù)的使用 1、對int類型數(shù)組排序 2、對char類型排序 3、對浮點型排序 4.比較字符串 4.1按首字母排序 4.2按長度排序 4.3按字典順序 5.結(jié)構(gòu)體排序 5.1 多級排序 三、模擬實現(xiàn)qsort函數(shù) 【冒泡排序的實現(xiàn)】 【主函數(shù)部分】 【代碼詳解】 ?【代碼實現(xiàn)之整

    2024年02月13日
    瀏覽(25)
  • C語言快速排序——qsort函數(shù)

    C語言快速排序——qsort函數(shù)

    ? 上面的是我們標準C語言庫里面對qsort函數(shù)的介紹,我們先來從排序說起:? 這就不得不提出編程中最最基礎的排序算法--- 冒泡排序? 對于一個任意的無序數(shù)列,我們?nèi)绻胍阉懦身樞驍?shù)列的話,我們就可以讓每一項跟后面的一項去比較,然后交換兩個數(shù),最終得到一個

    2024年01月22日
    瀏覽(21)
  • 【C語言】輕松模擬實現(xiàn)qsort函數(shù)

    【C語言】輕松模擬實現(xiàn)qsort函數(shù)

    君兮_的個人主頁 勤時當勉勵 歲月不待人 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,我們今天接著上回更新的內(nèi)容,講講我們?nèi)绾文M實現(xiàn)自己的qsort函數(shù), 廢話不多說,我們開始今天的內(nèi)容。 關(guān)于這方面的內(nèi)容已經(jīng)在上篇博客中具體介紹了,這里不再綴敘,感興趣的話可

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包