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

【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解

這篇具有很好參考價(jià)值的文章主要介紹了【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法
先記錄一下訪問量突破2000啦,謝謝大家支持?。。?br> 這里是上期指針進(jìn)階鏈接,方便大家查看:添加鏈接描述

前言

大家好呀,今天分享一下上期指針進(jìn)階中剩余的內(nèi)容——回調(diào)函數(shù),這個(gè)很重要滴,讓我們一起來學(xué)會(huì)學(xué)懂他吧?。?!


一、回調(diào)函數(shù)是什么

標(biāo)準(zhǔn)概念:
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)
函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)
的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)
行響應(yīng)。

簡單來說就是:在另一個(gè)函數(shù)中利用函數(shù)指針調(diào)用的函數(shù)叫做回調(diào)函數(shù)

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

1.使用標(biāo)準(zhǔn)庫中的qsort函數(shù)

qsort函數(shù)不僅可以排序整型數(shù)組,還可以排序結(jié)構(gòu)體等數(shù)據(jù)類型

代碼如下:

#include <stdio.h>
//qosrt函數(shù)的使用者得實(shí)現(xiàn)一個(gè)比較函數(shù)
int int_cmp(const void * p1, const void * p2)
{
  return (*( int *)p1 - *(int *) p2);
}//這里必須有使用者根據(jù)自己的排序依據(jù)自己寫的比較函數(shù)

int main()
{
    int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    int i = 0;
    
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
    //qsort的第一個(gè)參數(shù)是排序數(shù)組的首元素地址
    //第二個(gè)參數(shù)是排序的長度
    //第三個(gè)參數(shù)是每個(gè)元素的大小
    //第四參數(shù)是使用者自己寫的排序依據(jù)函數(shù)的地址(這里就是使用回調(diào)函數(shù))
    for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
   {
       printf( "%d ", arr[i]);
   }
    printf("\n");
    return 0;
}

整型數(shù)組排序的運(yùn)行結(jié)果展示:
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法

2.利用qsort函數(shù)對(duì)結(jié)構(gòu)體數(shù)組進(jìn)行排序

先看代碼如下:

#include<stdio.h>
#inlcude<string.h>
struct stu {
	int age;
	char name[20];
	double score;
};
//依據(jù)年齡大小排序的比較函數(shù)
int compar_by_age(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//依據(jù)名字排序的比較函數(shù)
int compar_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{
//這是定義一個(gè)結(jié)構(gòu)體類型的數(shù)組
	struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
	int Ssz = sizeof(S) / sizeof(S[0]);
	qsort(S, Ssz, sizeof(S[0]), compar_by_age);
	qsort(S, Ssz, sizeof(S[0]), compar_by_name);
	return 0;
}

排序前后結(jié)果對(duì)比:
這是排序前結(jié)構(gòu)體數(shù)組的順序:
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法
這是按照年齡排序后的順序:
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法
這是按照姓名排序后的順序:
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法

三、實(shí)現(xiàn)qsort函數(shù)

我們先來看一下qsort函數(shù)在標(biāo)準(zhǔn)庫中的模樣:
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法
他沒有返回值,四個(gè)參數(shù)分別是:
1、qsort的第一個(gè)參數(shù)是排序數(shù)組的首元素地址
2、第二個(gè)參數(shù)是排序的長度
3、第三個(gè)參數(shù)是每個(gè)元素的大小
4、第四參數(shù)是使用者自己寫的排序依據(jù)函數(shù)的地址(這里就是使用回調(diào)函數(shù))

作者是依據(jù)冒泡排序?qū)崿F(xiàn)的qosrt函數(shù),我們之間上代碼:
#include<stdio.h>
#inlcude<string.h>
//依據(jù)名字排序的比較函數(shù)
int compar_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
//依據(jù)整型大小排序的比較函數(shù)
int int_cmp(const void * p1, const void * p2)
{//這里都會(huì)將接收到的地址轉(zhuǎn)換為所需要比較的類型
  return (*( int *)p1 - *(int *) p2);
}

//這里排序中交換兩個(gè)元素的交換函數(shù)
void Swap(char* x, char* y,int size)
{
//利用char* 接收需要交換的元素,可以保證對(duì)其每個(gè)字節(jié)進(jìn)行交換從而實(shí)現(xiàn)整體全部字節(jié)的交換
//size就是該元素所占字節(jié)的大小,決定每次交換循環(huán)幾次
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char temp = *x;
		*x = *y;
		*y = temp;
		x++;
		y++;

	}
}

void Bubble_Sort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < num - 1; i++)
	{
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
		//為什么要將首元素地址轉(zhuǎn)換為char* 類型呢?
		//因?yàn)?這樣可以保證任何類型數(shù)組在排序比較時(shí)能夠訪問到其中的每一個(gè)元素
		//這個(gè)設(shè)計(jì)是真的巧妙
			if (compar(((char*)base + j * size), ((char*)base + (j+1)*size))>0)
			{
				Swap(((char*)base + j * size), ((char*)base + (j+1)*size), size);
			}
		}
	}
}

對(duì)其進(jìn)行測試:

int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
	int Ssz = sizeof(S) / sizeof(S[0]);
	int sz = sizeof(arr) / sizeof(arr[0]);
	Bubble_Sort(arr,sz,sizeof(arr[0]),compar_by_int);
	Print(arr, sz);
	Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_age);
	Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_name);
	return 0;
}

可以得到,排序結(jié)果和上面調(diào)用標(biāo)注庫中qsort函數(shù)的結(jié)果是相同的
【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解,c語言,算法

總結(jié)

關(guān)于回調(diào)函數(shù)的分享就到這里啦,希望qsort函數(shù)可以幫助到大家,博主感覺他真的是很有用,以后會(huì)盡量使用到他的,希望本篇文章可以幫助到大家,謝謝大家閱讀!?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-653340.html

到了這里,關(guān)于【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

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

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

    回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一 個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該 函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用

    2024年02月13日
    瀏覽(20)
  • 【C語言】——指針六:冒泡排序與qsort函數(shù)的實(shí)現(xiàn)

    【C語言】——指針六:冒泡排序與qsort函數(shù)的實(shí)現(xiàn)

    1.1、冒泡排序的原理 ?? ??在實(shí)踐過程中,我們難免會(huì)碰到要給一組數(shù)據(jù)排序的情況。如果我們掌握一些排序的算法,效率就會(huì)高很多。排序的方法有方法有很多,如:希爾排序,快速排序,堆排序……,今天,我們講的排序方法就是—— 冒泡排序 ! ?? ??冒泡排序

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

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

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

    2024年02月10日
    瀏覽(27)
  • C語言——qsort函數(shù)的使用(詳解)

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

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

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

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

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

    2024年01月22日
    瀏覽(21)
  • C語言標(biāo)準(zhǔn)庫函數(shù)qsort( )——數(shù)據(jù)排序

    C語言標(biāo)準(zhǔn)庫函數(shù)qsort( )——數(shù)據(jù)排序

    ?? 大家好!我是保護(hù)小周?,本期為大家?guī)淼氖巧疃冉馄蔆語言標(biāo)準(zhǔn)庫函數(shù) qsort(), qsort()函數(shù)他可以對(duì) 任意類型 的數(shù)據(jù)排序, 博主會(huì)詳細(xì)解釋函數(shù)使用方法,以及使用快速排序的左右指針法模擬實(shí)現(xiàn)函數(shù)功能 , 這樣的排序確定不來學(xué)習(xí)一下嗎??? ? 目錄 一、qsort()函

    2024年02月03日
    瀏覽(29)
  • 排序之玩轉(zhuǎn)qsort函數(shù)——【C語言】

    排序之玩轉(zhuǎn)qsort函數(shù)——【C語言】

    說起排序,我們會(huì)想起許多算法,在之前的博客中我也寫到過,比如:冒泡排序法、快速排序法、選擇排序法等等。其實(shí)在C語言中一直有一個(gè)可以將數(shù)組中的內(nèi)容進(jìn)行排序的函數(shù)且功能完善內(nèi)容齊全的庫函數(shù)——qsort函數(shù)。今天就讓我們來探索一下吧! 目錄 回調(diào)函數(shù) 初始

    2024年02月13日
    瀏覽(49)
  • C語言題目 - 調(diào)用qsort函數(shù)對(duì)數(shù)組進(jìn)行排序

    如題 其實(shí)沒什么難的,只要嚴(yán)格按照 qsort 函數(shù)的參數(shù)來填充即可,這里要用到 函數(shù)指針 。 qsort 函數(shù)的原型如下: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); 參數(shù)說明: base :指向需要排序的數(shù)組的指針,數(shù)組中每個(gè)元素的大小應(yīng)為 size 字節(jié)。

    2024年02月11日
    瀏覽(20)
  • C語言庫函數(shù)之 qsort 講解、使用及模擬實(shí)現(xiàn)

    C語言庫函數(shù)之 qsort 講解、使用及模擬實(shí)現(xiàn)

    我們?cè)趯W(xué)習(xí)排序的時(shí)候,第一個(gè)接觸到的應(yīng)該都是冒泡排序,我們先來復(fù)習(xí)一下冒泡排序的代碼,來作為一個(gè)鋪墊和引入。 代碼如下: 很簡單的一種排序方法,但我們可以發(fā)現(xiàn)一個(gè)問題,那就是冒泡排序不夠通用,它只能用于整型數(shù)組的排序,如果我要排序float類型,或者排

    2024年02月12日
    瀏覽(20)
  • memcmp函數(shù)詳解 看這一篇就夠了-C語言(函數(shù)講解、函數(shù)實(shí)現(xiàn)、使用用法舉例、作用、自己實(shí)現(xiàn)函數(shù) )

    memcmp函數(shù)詳解 看這一篇就夠了-C語言(函數(shù)講解、函數(shù)實(shí)現(xiàn)、使用用法舉例、作用、自己實(shí)現(xiàn)函數(shù) )

    memcmp()函數(shù)用于:比較兩個(gè)內(nèi)存塊 函數(shù)聲明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 參數(shù): ptr1:指向內(nèi)存塊的指針。 ptr2:指向內(nèi)存塊的指針。 數(shù)字:要比較的字節(jié)數(shù)。 返回值: 0: 在兩個(gè)內(nèi)存塊中不匹配的第一個(gè)字節(jié)在? ptr1 ?中的值低于 在 ptr2 ?中的值(如果計(jì)

    2023年04月09日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包