深入理解指針(五)

1. 回調函數是什么?

2. qsort使用舉例

3. qsort函數的模擬實現


1. 回調函數是什么?

回調函數就是?個通過函數指針調用的函數。
如果你把函數的指針(地址)作為參數傳遞給另?個函數,當這個指針被用來調用其所指向的函數
時,被調用的函數就是回調函數。回調函數不是由該函數的實現方直接用,而是在特定的事件或條 件發?時由另外的?方調用的,用于對該事件或條件進行響應。
我們寫的計算機的實現的代碼中,紅色框中的代碼是重復出現的,其中雖然執行計算的邏輯
是區別的,但是輸?輸出操作是冗余的,有沒有辦法,簡化?些呢?因為紅色框中的代碼,只有調用函數的邏輯是有差異的,我們可以把調?的函數的地址以參數的形式
傳遞過去,使用函數指針接收,函數指針指向什么函數就調用什么函數,這里其實使用的就是回調函數的功能。
使用回調函數改造前:
#include <stdio.h>
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;
}
int main() {int x, y;int input = 0;int ret = 0;do {printf("*******************\n");printf("**1.add     2.sub**\n");printf("**3.mul     2.div**\n");printf("**0.退出程序   ****\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);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;
}

運行效果:

?

使用回調函數改造后:?

#include <stdio.h>
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(*p)(int, int)) {int x, y;int ret = 0;printf("請輸入操作數:");scanf("%d %d", &x, &y);ret = p(x, y);printf("ret=%d\n", ret);
}
int main() {int input = 0;do {printf("*******************\n");printf("**1.add     2.sub**\n");printf("**3.mul     2.div**\n");printf("**0.退出程序   ****\n");printf("*******************\n");printf("請選擇:");scanf("%d", &input);switch (input) {case 1: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 <stdio.h>
int int_cmp(const void* p1, const void* p2) {return(*(int*)p1 - *(int*)p2);
}
int main() {int arr[] = { 1,4,5,2,6,8,0,9,7,3 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), int_cmp);for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

運行效果:?

2.2 使用qsort排序結構數據

這里需要補充介紹結構體和結構體成員訪問操作符"->";?

代碼實現:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu{char name[20];int age;
};
void print(struct stu arr[], int sz) {for (int i = 0; i < sz; i++) {printf("%s:%d ", arr[i].name, arr[i].age);}printf("\n");
}
int cmp_stu_age(const void* p1, const void* p2) {return (((struct stu*)p1)->age - ((struct stu*)p2)->age);
}
int cmp_stu_name(const void* p1, const void* p2) {
//strcmp - 是庫函數,是專??來?較兩個字符串的??的
//假設按照名字來?較return strcmp((((struct stu*)p1)->name) ,(((struct stu*)p2)->name));
}
//按年齡排序
void test1() {struct stu arr[] = { {"zhangsan",35},{"lisi",20},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_age);print(arr, sz);
}
//按名字排序
void test2() {struct stu arr[] = { {"zhangsan",35},{"lisi",20},{"wangwu",18} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_name);print(arr, sz);
}
int main() {test1();test2();return 0;
}

運行效果:?


?3. qsort函數的模擬實現

用回調函數,模擬實現qsort(采用冒泡的?式)。
注意:這里第?次使?用void* 的指針,講解 void* 的作用。

?

?代碼實現:

#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
void _swap(void* p1, void* p2, int size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) >0){_swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

運行效果:


完。?

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

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

相關文章

Docker 日志

Docker 日志是排查容器故障、監控運行狀態的重要工具。下面從 日志查看命令、詳解字段、日志驅動、最佳實踐 四個方面給你詳細解析。 一、最常用日志命令 1. 查看容器日志&#xff08;默認 stdout、stderr&#xff09; docker logs <container_name|container_id>2. 實…

SAP生產環境修改程序

1. 關鍵的兩個標準函數 TRINT_CORR_INSERT TRINT_CORR_CHECK 2. 自定義SAP生產環境修改程序 *data:begin of itab occurs 0, * lines(150), * end of itab. DATA itab TYPE TABLE OF string. PARAMETERS:program LIKE rs38m-programm. READ REPORT program INT…

構建高性能網絡服務:從Reactor模式到現代服務器架構設計

在當今高并發、低延遲的應用場景下&#xff0c;如何設計高效穩定的網絡服務成為后端開發的核心挑戰。本文將深入探討網絡服務的演進路徑&#xff0c;結合Reactor模式、one thread one loop思想等關鍵技術&#xff0c;揭示高性能服務器架構的設計精髓。 一、網絡通信的核心問題與…

HarmonyOS 5 多端適配原理與BreakpointSystem工具類解析:附代碼

H 一、鴻蒙多端適配的核心概念 鴻蒙系統的多端適配通過響應式布局和媒體查詢實現&#xff0c;核心在于根據設備屏幕尺寸動態調整UI結構。其實現邏輯與Web響應式設計類似&#xff0c;但針對鴻蒙ArkUI框架進行了定制化封裝。 二、BreakpointSystem工具類&#xff1a;多端適配的…

Telerik生態整合:Kendo UI for Angular組件在WinForms應用中的深度嵌入(二)

Telerik DevCraft包含一個完整的產品棧來構建您下一個Web、移動和桌面應用程序。它使用HTML和每個.NET平臺的UI庫&#xff0c;加快開發速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于構建現代和面向未來的業務應用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

紅帽全球副總裁曹衡康:開源AI開啟企業級應用新紀元

在生成式AI技術迅猛發展的今天&#xff0c;ChatGPT、DeepSeek、元寶等AI應用已不再僅僅是科技前沿的象征&#xff0c;而是切實地融入到了我們的工作與生活之中&#xff0c;為企業帶來了前所未有的變革機遇。對于企業而言&#xff0c;如何有效利用AI技術降本增效&#xff0c;已成…

異構計算解決方案(兼容不同硬件架構)

異構計算解決方案通過整合不同類型處理器&#xff08;如CPU、GPU、NPU、FPGA等&#xff09;&#xff0c;實現硬件資源的高效協同與兼容&#xff0c;滿足多樣化計算需求。其核心技術與實踐方案如下&#xff1a; 一、硬件架構設計 異構處理器組合? 主從協作模式?&#xff1a…

中科米堆汽車車門自動化三維檢測3D尺寸測量設備自動外觀檢測

汽車的每一個零部件的質量都關乎著整車的性能與安全。汽車車門作為車輛的重要組成部分&#xff0c;不僅承擔著保護車內人員安全的關鍵職責&#xff0c;其外觀質量與尺寸精度也直接影響著消費者的第一印象和駕駛體驗。 汽車車門制造涉及眾多復雜的工藝流程&#xff0c;從沖壓成…

Python 數據分析與可視化 Day 4 - Pandas 數據篩選與排序操作

&#x1f3af; 今日目標 掌握 Pandas 中 groupby() 的使用方式學會使用 agg() 方法進行多個聚合掌握 pivot_table() 構建透視表結合分組與排序進行更深入的分析 &#x1f9ee; 一、基本分組統計&#xff08;groupby&#xff09; ? 分組 單列聚合 df.groupby("性別&qu…

智能營銷系統對企業的應用價值

在當前快速迭代的商業環境中&#xff0c;企業與客戶的連接方式正經歷前所未有的深刻變革。傳統的市場策略在數據洪流和日益個性化的消費者需求面前&#xff0c;效能正逐步遞減。 企業決策者普遍面臨一個核心挑戰&#xff1a;如何在復雜多變的市場中&#xff0c;實現營銷資源的最…

docker鏡像中集成act工具

# 使用官方 Ubuntu 22.04 基礎鏡像 FROM ubuntu:22.04# 安裝系統依賴并清理緩存 RUN apt-get update && \apt-get install -y --no-install-recommends \curl \git \make \gcc \g \libssl-dev \pkg-config \&& \apt-get clean && \rm -rf /var/lib/apt…

Docker 與 Containerd 交互機制簡單剖析

#作者&#xff1a;鄧偉 文章目錄 一、背景&#xff1a;Docker 架構的演進之路1.1 從自研運行時到 OCI 標準化1.2 現行架構分層模型 二、核心交互組件解析2.1 通信協議&#xff1a;gRPC 雙向流的應用2.2 鏡像生命周期管理交互2.2.1 鏡像拉取流程&#xff08;以 docker pull 為例…

C++ Vector 基礎入門操作

一、Vector初始化&#xff1a;5種常用方式 ??1. 默認構造?? 創建空容器&#xff0c;適用于后續動態添加元素&#xff1a; std::vector<int> vec; // 空vector&#xff0c;size0 2. 指定大小和初值?? 預分配空間并初始化元素&#xff1a; std::vector<int>…

社會治理創新平臺PPT(48頁)

社會治理創新背景 社會治理創新旨在加強和完善基層社會管理和服務體系&#xff0c;提升政府效能&#xff0c;強化城鄉社區自治和服務功能。自黨的十六屆四中全會提出“推進社會管理體制創新”以來&#xff0c;社會治理創新已成為政府工作的重要篇章。 社會治理創新現狀與挑戰…

論文筆記:Answering POI-Recommendation Questions using TourismReviews

2021 CIKM 1 intro 根據貝恩公司&#xff08;Bain & Company&#xff09;2019年的一份報告&#xff0c;旅行者在預訂前通常會進行33至500次網頁搜索 部分用戶會訪問超過50個旅游網站&#xff0c;三分之一的上網時間都用于與旅行相關的活動。在某些情況下&#xf…

帶約束的高斯牛頓法求解多音信號分離問題

一、信號模型與優化問題建立 1. 復信號模型 設觀測的復信號由兩個單頻復指數信號加噪聲組成&#xff1a; x [ n ] A 0 e j ( 2 π f 0 n T s ? 0 ) A 1 e j ( 2 π f 1 n T s ? 1 ) w [ n ] , n 0 , 1 , … , N ? 1 x[n] A_0 e^{j(2\pi f_0 n T_s \phi_0)} A_1 e…

Java并發編程中高效緩存設計的哲學

文章目錄 引言詳解緩存的設計和演進基于緩存存儲運算結果鎖分段散列減小鎖粒度異步化提升處理效率原子化避免重復運算小結參考引言 本文將基于并發編程和算法中經典的哈希取模、鎖分段、 異步化、原子化。這幾個核心設計理念編寫逐步推演出一個相對高效的緩存工具,希望對你有…

MATLAB的.mat文件

.mat文件是MATLAB的專有二進制數據文件格式&#xff0c;用于保存MATLAB工作空間中的變量和數據。 主要特點&#xff1a; 1. 存儲內容&#xff1a; 各種類型的變量&#xff08;數組、矩陣、結構體、單元數組等&#xff09;函數句柄、對象稀疏矩陣多維數組 2. 文件特性&#…

ICM-20948 Wake on Motion功能開發全過程(7)

接前一篇文章:ICM-20948 Wake on Motion功能開發全過程(6) 探索工作 深入探索 上一回講到,筆者在InvenSense官網上找到了實現Wake on Motion功能的指導文檔。其中主要步驟如下: 本回就來結合文檔中的步驟,詳細講解每一步。 (1)第1步 —— 初始化所有配置 注意,文檔…

Dipal D1:數字人時代的全新人機關系形態

在科技不斷突破的今天,虛擬與現實之間的界限正變得越來越模糊。Dipal D1 作為全球首款搭載2.5K曲面OLED顯示屏的3D AI數字人硬件產品,不僅是一款情感陪伴設備,更是AI、AIGC、動漫文化與情感科技深度融合下的全新交互入口。它代表著“孤獨經濟”、“創作者經濟”和“虛擬互動…