指針(4)

1.回調函數

回調函數就是通過函數指針調用的函數。

將函數的指針(地址)作為一個參數傳遞給另一個函數,當這個指針被調用其所指向的函數時,被調用的函數就是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外一方調用的,用于對該事件或條件進行響應。

計算器的實現:

menu()
{printf("********************\n");printf("*** 1.add  2.sub ***\n");printf("*** 3.mul  4.div ***\n");printf("*** 0.exit       ***\n");printf("********************\n");
}int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Mul(int x, int y)
{return x * y;
}int Div(int x, int y)
{return x / y;
}void calc(int(*pf)(int,int))//傳過來的是函數的地址,要用函數指針變量來接收
{int x = 0;int y = 0;int ret = 0;printf("請輸入兩個操作數:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}int main()
{int input = 0;do{menu();printf("請選擇:");scanf("%d", &input);switch (input){case 1://calc功能強大了calc(Add);//完成相應的計算 加法、減法、乘法、除法 通過傳函數的地址來實現對應的計算,需要函數指針來接收break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf("退出計算器\n");break;default:printf("請重新選擇\n");break;}} while (input);return 0;
}

?

2.qsort使用舉例

2.1使用 qsort 函數排序整形數據

#include<stdlib.h>
void print_arr(int arr[],int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}//cmp_int 這個函數是用來比較p1和p2指向元素的大小// cmp—函數的使用者提供,誰使用誰提供//cmp函數中的參數類型必須和 test() 函數中的qsort中的第四個參數類型保持一致才可以傳過去
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;}//測試qsort排序整型數據
void test1()
{int arr[10] = { 5,3,2,1,0,9,8,4,7,6 };int sz = sizeof(arr) / sizeof(arr[0]);print_arr(arr,sz);qsort(arr, sz, sizeof(arr[0]), cmp_int);//qsort 函數底層用的是快速排序print_arr(arr,sz);
}
int main()
{test1();//用來實現整型數據的排序return 0;
}

2.2使用qsort排序結構數據

//測試qsort排序結構體數據struct Stu
{char name[20];int age;};//比較2個結構體的數據???
//不能直接使用 < > == 來比較
// 
//1.按照名字來比較
//2.按照年齡來比較//按照年齡來比較
int cmp_stu_by_age(const void* p1, const void* p2)
{return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;//升序//                   p2                       p1       //降序//(*(struct Stu*)p1).age
}
//-> 僅限于結構體指針運用
//結構體指針->成員名
//結構體變量.成員名#include<string.h>
//按照姓名來比較:比較對應位置上的字母相對應的ASCII碼值
//兩個字符串是不能使用 >  < == 來進行比較的
//比較字符串是 strcmp - string compare 返回類型和
//int cmp_stu_by_name(const void* p1, const void* p2) 一樣: <0 >0 =0 
//所以直接 return 0 返回
int cmp_stu_by_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}test2()
{struct Stu arr[] = { {"xiaoming",14},{"xiaohong",16},{"xiaolan",17} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);}test3()
{struct Stu arr[] = { {"xiaoming",14},{"xiaohong",16},{"xiaolan",17} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);}
int main()
{test1();//用來實現整型數據的排序test2();//用來實現結構體指針數據的排序test3();//按照結構體年齡來排序return 0;
}

3.qsort函數的模擬實現

使用回調函數,模擬實現qsort的功能(采用冒泡排序)

代碼中使用 void * 的指針,是方便接收任何類型的地址,以此來實現任何類型的排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp_int(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}void Swap(char *buf1, char *buf2, size_t width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}}
//參照qsort(arr, sz,sizeof(arr[0]),cmp_int);來寫bubble_sort2函數
void bubble_sort2(void* base, size_t sz, size_t width, int(*cmpar)(const void* p1, const void* p2))
//只希望接收p1和p2的地址,不想由任何的改變,所以加上const
{int i = 0;for (i = 0; i < sz; i++)//趟數不變,這個不變{int j = 0;for (j = 0; j < sz - 1 - i; j++)//每相鄰的元素的比較不變,這個也不變{//if (arr[j] > arr[j + 1]) 不再是數組—>改變if(cmpar((char*)base+j*width,(char*)base+(j+1)*width)>0){/*int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;*///交換-->也變Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);}}}
}void test3()
{int arr[10] = { 2,6,4,8,9,3,0,1,7,5 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort2(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}struct Stu //學生
{char name[20];int age;
};
int cmp_stu_by_age(const void*p1,const void*p2)
{return ((struct Stu*)p1)->age - ((struct Stu *)p2)->age;
}int cmp_stu_by_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name,((struct Stu*)p2)->name);
}
void test4()
{struct Stu arr[] = { {"mingxiao",25},{"hongxiao",27},{"lanxiao",23} };int sz = sizeof(arr) / sizeof(arr[0]);//bubble_sort2(arr, sz, sizeof(arr[0]), cmp_stu_by_name);bubble_sort2(arr, sz, sizeof(arr[0]), cmp_stu_by_age);//打印數組內容int i = 0;for (i = 0; i < sz; i++){printf("%s %d\n", arr[i].name, arr[i].age);}}int main()
{//test1();//冒泡排序實現數組的升序//test2();//用qsort函數來實現數組的升序test3();//自己用bubble_sort2來實現qsort函數的功能,以此來達到實現能夠排序任意類型數據的目的//1.先實現bubble_sort2()函數,再進行后續的操作//2.bubble_sort2()函數里面兩個相鄰函數的比較以及交換test4();//用bubble_sort2()函數來實現結構體的中數據的排序return 0;
}

?在Swap中用 char * 來接收是為了方便交換,特別是結構體類型的數據,大小是不確定的,可能是4字節、16字節、23字節等等,根據使用者自己編寫的代碼來分配大小,一個一個字節的交換可以實現單數(9)字節大小的單位的類型交換,來達到實現任意類型數據的交換。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Raptor碼的解碼成功率matlab實現

下面是使用matlab實現關于Raptor 碼解碼成功率的仿真代碼&#xff0c;并繪制成功率隨編碼符號數量變化的圖形示例。代碼中包含了 Raptor 碼的預編碼&#xff08;使用稀疏矩陣乘法模擬&#xff09;、LT 編碼、解碼過程&#xff0c;以及解碼成功率的計算和繪圖。 具體代碼如下&am…

域名系統DNS

DNS介紹 DNS是一個域名系統&#xff0c;在互聯網環境中為域名和IP地址相互映射的一個分布式數據庫 &#xff0c; 能夠使用戶更方便的訪問互聯網&#xff0c;而不用去記住能夠被機器直接讀取的IP數串。類似于生活中的114服務&#xff0c;可以通過人名找到電話號碼&#xff0c;也…

Spark Streaming核心編程總結(四)

一、有狀態轉化操作&#xff1a;UpdateStateByKey 概念與作用 UpdateStateByKey 用于在流式計算中跨批次維護狀態&#xff08;如累加統計詞頻&#xff09;。它允許基于鍵值對形式的DStream&#xff0c;通過自定義狀態更新函數&#xff0c;將歷史狀態與新數據結合&#xff0c;生…

Dijkstra 算法代碼步驟[leetcode.743網絡延遲時間]

有 n 個網絡節點&#xff0c;標記為 1 到 n。 給你一個列表 times&#xff0c;表示信號經過 有向 邊的傳遞時間。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源節點&#xff0c;vi 是目標節點&#xff0c; wi 是一個信號從源節點傳遞到目標節點的時間。 現在&#xff0c;…

【java】lambda表達式總結

目錄 一、面向對象的處理方法 二、函數式編程的處理方法 先使用匿名內部類&#xff1a; lambda改造&#xff1a; lambda改造規則 示例&#xff1a; 三、補充&#xff1a;函數式接口 大家好&#xff0c;我是jstart千語。今天總結一下lambda表達式。lambda表達式在后面的s…

AtCoder Beginner Contest 242 G - Range Pairing Query (莫隊)

每周五篇博客&#xff1a;&#xff08;5/5&#xff09; 我做到了&#xff01; https://atcoder.jp/contests/abc242/tasks/abc242_g 這題主要是想給大家提供一份莫隊的板子&#xff0c;很多莫隊題基本上填空就差不多了&#xff08; 板子 void solve() {int n;std::cin >…

淘寶商品主圖標題api接口

1、輸入淘寶商品id或者鏈接&#xff0c;點查詢 2、查詢淘寶商品主圖&#xff0c;商品標題&#xff0c;商品價格&#xff0c;賣家旺旺 3、支持api接口

文心一言開發指南06——千帆大模型平臺新手指南

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 千帆大模型平臺為新手用戶提供了一個全面的入門指南&#xff0c;以便用戶能夠快速熟悉平臺的操作和功能。千帆大模型平臺通過提供詳細的新手指南&#xff0c;確保用戶能夠順…

Pacman-N-queen

文檔 代碼及文檔&#xff1a;通過網盤分享的文件&#xff1a;code 鏈接: https://pan.baidu.com/s/1Rgo9ynnEqjZsSP2-6TyS8Q?pwdn99p 提取碼: n99p 補充核心代碼 核心代碼內容&#xff1a; genetic_algorithm,py # -*- coding: utf-8 -*- """ Created on …

常用的多傳感器數據融合方法

1. 概述 根據具體需求&#xff08;實時性、計算資源、噪聲特性&#xff09;選擇合適的方法&#xff0c;實際應用中常結合多種方法&#xff08;如UKF與神經網絡結合&#xff09;。 傳統方法 &#xff08;KF/EKF/UKF/PF&#xff09;依賴數學模型&#xff0c;適合動態系統&#…

簡單幾步,開啟 Intel VT-x 讓電腦“解開CPU封印”

#vmware #虛擬機 #cpu虛擬化 # Intel VT-x 前言 你是不是也遇到過這種情況&#xff1a;在嘗試運行虛擬機&#xff08;VM&#xff09;、安卓模擬器&#xff0c;或者使用 Windows 沙盒、WSL2 等功能時&#xff0c;遇到了類似“此主機支持 Intel VT-x&#xff0c;但 Intel VT-x …

Go語言--語法基礎4--基本數據類型--字符串類型

在 Go 語言中&#xff0c;字符串也是一種基本類型。相比之下&#xff0c; C/C 語言中并不存在原 生的字符串類型&#xff0c; 通常使用字符數組來表示&#xff0c;并以字符指針來傳遞。 Go 語言中字符串的聲明和初始化非常簡單&#xff0c;舉例如下&#xff1a; var str st…

QT中的事件及其屬性

Qt中的事件是對操作系統提供的事件機制進行封裝&#xff0c;Qt中的信號槽就是對事件機制的進一步封裝 但是特殊情況下&#xff0c;如對于沒有提供信號的用戶操作&#xff0c;就需要通過重寫事件處理的形式&#xff0c;來手動處理事件的響應邏輯 常見的Qt事件&#xff1a; 常見事…

socket套接字-UDP(中)

socket套接字-UDP&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147465441?fromshareblogdetail&sharetypeblogdetail&sharerId147465441&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link UDP服務器…

C++入門小館: STL 之queue和stack

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

ALTER TABLE 刪除DROP表列的報錯: 因為有一個或多個對象訪問此列

目錄 1.問題 2.解決辦法 1.問題 刪除某個列名的時候&#xff0c;提示錯誤因為有一個或多個對象訪問此列 2.解決辦法 2.1 添加或刪除表新列名 將表中的字段設置Default 或 NOT NULL 都會給該字段添加約束&#xff0c;增加了這些約束后&#xff0c;再SQL腳本修改類型、刪除會發生…

python源碼打包為可執行的exe文件

文章目錄 簡單的方式&#xff08;PyInstaller&#xff09;特點步驟安裝 PyInstaller打包腳本得到.exe文件 簡單的方式&#xff08;PyInstaller&#xff09; 特點 支持 Python 3.6打包為單文件&#xff08;–onefile&#xff09;或文件夾形式自動處理依賴項 步驟 安裝 PyIns…

【2025最近Java面試八股】Spring中循環依賴的問題?怎么解決的?

1. 什么是循環依賴&#xff1f; 在Spring框架中&#xff0c;循環依賴是指兩個或多個bean之間相互依賴&#xff0c;形成了一個循環引用的情況。如果不加以處理&#xff0c;這種情況會導致應用程序啟動失敗。導致 Spring 容器無法完成依賴注入。 例如&#xff1a; Service publi…

JimuBI 積木報表 v1.9.5發布,大屏和儀表盤,免費數據可視化

項目介紹 JimuBI (積木報表BI) 是一款免費的數據可視化產品&#xff0c;含大屏和儀表盤、門戶、移動圖表&#xff0c;像搭建積木一樣完全在線設計&#xff01; 大屏采用類word風格&#xff0c;可以隨意拖動組件&#xff0c;想怎么設計怎么設計&#xff0c;可以像百度和阿里一樣…

云原生課程-Docker

一次鏡像&#xff0c;到處運行。 1. Docker詳解&#xff1a; 1.1 Docker簡介&#xff1a; Docker是一個開源的容器化平臺&#xff0c;可以幫助開發者將應用程序和其依賴的環境打包成一個可移植的&#xff0c;可部署的容器。 docker daemon:是一個運行在宿主機&#xff08;DO…