初識指針(5)<C語言>

前言

??????? 在前幾篇文章中,已經介紹了指針一些基本概念、用途和一些不同類型的指針,下文將介紹某些指針類型的運用。本文主要介紹函數指針數組、轉移表(函數指針的用途)、回調函數、qsort使用舉例等。


函數指針數組

??????? 函數指針數組即每個元素都是函數地址的數組。

//函數指針數組
int jia(int x, int y) {//加法函數return x + y;
}
int jian(int x, int y) {//減法函數return x - y;
}
int cheng(int x, int y) {//乘法函數return x * y;
}
int chu(int x, int y) {//除法函數return x / y;
}
int main() {int (*p[4]) (int, int) = {jia,jian,cheng,chu};//保證p與[]先結合成數組,之后再與*結合,構成指針數組,最后再和函數結合return 0;
}

?轉移表(函數指針的用途)

??????? 假如我們寫個程序完成對兩個數之間的簡單數學運算(加減乘除),按照正常的寫法,選擇一種計算后進入判斷環節,之后再輸入數字,這樣寫每一種運算下都會有代碼重復,有沒有辦法簡化代碼呢?


回調函數

??????? 即一個通過函數指針調用的函數。

??????? 通過回調函數,可以消除特定場景中因為多分支造成的重復代碼,例如:一個實現加減乘除的程序中,每個分支下都有一種運算,每個運算可寫成一個函數,我們可以再寫一個函數將每種分支下的重復代碼包含進去,通過傳入函數指針來調用運算函數,從而完成運算。

//回調函數
int jia(int x, int y) {return x + y;
}
int jian(int x, int y) {return x - y;
}
int cheng(int x, int y) {return x * y;
}
int chu(int x, int y) {return x / y;
}
void menu() {printf("**********************\n");printf("***1.加法   2.減法****\n");printf("***3.乘法   4.除法****\n");printf("***    0.exit     ****\n");printf("**********************\n");
}
int hui(int(*p)(int, int)) {int x, y;printf("請輸入操作數\n");scanf("%d%d", &x, &y);return p(x, y);
}
int main() {int i, x, y,ret;do {menu();printf("請選擇—>");scanf("%d", &i);switch (i) {case 1:ret = hui(jia);printf("%d\n", ret);break;case 2:ret = hui(jian);printf("%d\n", ret);break;case 3:ret = hui(cheng);printf("%d\n", ret);break;case 4:ret = hui(chu);printf("%d\n", ret);break;case 0:printf("退出計算\n");break;default:printf("輸入錯誤,重新輸入\n");break;}} while (i);return 0;
}

qsort使用舉例

??????? qsort函數是C語言的庫函數,包含在<stdlib.h>頭文件中,它可用于對所有數據類型進行排序,包括結構體,使用這個庫函數,必須再寫個比較元素的函數,返回int型(大于0:大于、等于0:等于、小于0:小于),默認升序,如要進行逆序輸出,則在比較函數中,交換操作數的位置。

排序整型數組
//qsort函數,排序整型數組
#include<stdio.h>
#include<stdlib.h>
int  intcmp (const void* p1, const void* p2) {//比較函數,兩個元素的比較return (*(int*)p1) - (*(int*)p2);
}
int main() {int arr[6] = { 3,6,2,0,3,8 };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,//數據類型void*base,用于接受待排序的數組的數組名,也就是首元素的地址sz,//數據類型sizeof_t,待排序數組的元素個數sizeof(arr[0]),//數據類型sizeof_t,待排序數組元素字節大小intcmp);
//數據類型 int(*) (const void*,const void*),用于接收倆個元素比較的函數,
//返回值:大于0(表示大于),等于0(等于),小于0(小于)for (int i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

運行結果:

排序結構體

按字符排

//qsort函數,結構體
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {char name[100];int  age;int  height;
};
int namecmp(const void* p1, const void* p2) {//按名稱排return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
}
int main() {struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,sz,sizeof(arr[0]),namecmp);for (int i = 0; i < sz; i++) {printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);}return 0;
}

運行結果

?按照整形排

//qsort函數,結構體
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {char name[100];int  age;int  height;
};
//int namecmp(const void* p1, const void* p2) {//按名稱排
//	return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
//}
int agecmp(const void* p1, const void* p2) {//按照年齡排return (*(struct stu*)p1).age - (*(struct stu*)p2).age;
}
int main() {struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };int sz = sizeof(arr) / sizeof(arr[1]);qsort(arr,sz,sizeof(arr[0]),agecmp);for (int i = 0; i < sz; i++) {printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);}return 0;
}

?運行結果

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

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

相關文章

深度學習知識點全面總結

ChatGPT 深度學習是一種使用神經網絡來模擬人腦處理數據和創建模式的機器學習方法。下面是深度學習的一些主要知識點的總結&#xff1a; 1. 神經網絡基礎&#xff1a; - 神經元&#xff1a;基本的計算單元&#xff0c;模擬人腦神經元。 - 激活函數&#xff1a;用于增加神…

【CSP CCF記錄】數組推導

題目 過程 思路 每次輸入一個Bi即可確定一個Ai值&#xff0c;用temp記錄1~B[i-1]&#xff0c;的最大值分為兩種情況&#xff1a; 當temp不等于Bi時&#xff0c;則說明Bi值之前未出現過&#xff0c;Ai必須等于Bi才能滿足Bi是Ai前綴最大的定義。當temp等于Bi時&#xff0c;則說…

SpringAMQP-消息轉換器

這邊發送消息接收消息默認是jdk的序列化方式&#xff0c;發送到服務器是以字節碼的形式&#xff0c;我們看不懂也很占內存&#xff0c;所以我們要手動設置一下 我這邊設置成json的序列化方式&#xff0c;注意發送方和接收方的序列化方式要保持一致 不然回報錯。 引入依賴&#…

重磅推出:135屆廣交會采購商名錄,囊括28個行業數據!

5.5日&#xff0c;第135屆中國進出口商品交易會&#xff08;簡稱廣交會&#xff09;在廣州圓滿閉幕&#xff0c;這一全球貿易盛典再次展現了中國制造的卓越實力和文化魅力&#xff0c;成就斐然&#xff0c;吸引了全球目光。 本屆廣交會線下出口成交額達247億美元&#xff0c;對…

項目-坦克大戰-讓坦克動起來

為什么寫這個項目 好玩涉及到java各個方面的技術 1&#xff0c;java面向對象 2&#xff0c;多線程 3&#xff0c;文件i/o操作 4&#xff0c;數據庫鞏固知識 java繪圖坐標體系 坐標體系-介紹 坐標體系-像素 計算機在屏幕上顯示的內容都是由屏幕上的每一個像素組成的像素是一…

詳細解讀字節跳動視頻生成模型StoryDiffusion:連環畫創作和長視頻生成

Diffusion Models專欄文章匯總:入門與實戰 前言:最近字節跳動提出了一項關于特征一致圖像生成的工作StoryDiffusion,可以生成一系列特征主題相關的圖像,還可以擴展成具有時間一致性的幀序列,從而組成長視頻。這篇博客火速解讀這篇最新的工作,包括論文和代碼。 目錄 貢獻…

安卓開發問題:安卓Ble出現動態鑒權失敗以及掃描設備一直進入不了回調函數的問題

問題1描述 1、安卓12需要動態鑒權 // 鑒權函數 requestPermissions(permissionsList.toArray(strings), MyConstants.REQUEST_CODE_PERMISSIONS);但是在鑒權回調函數中如Manifest.permission.BLUETOOTH_SCAN、Manifest.permission.BLUETOOTH_CONNECT一直顯示失敗&…

力扣HOT100 - 70. 爬樓梯

解題思路&#xff1a; 動態規劃 注意 if 判斷和 for 循環 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

設計模式-10 - Memento Design Pattern

設計模式-10 - Memento Design Pattern 1.定義 備忘錄模式是一種設計模式&#xff0c;它允許在不破壞封裝性的情況下捕獲和恢復對象的內部狀態。 其結構&#xff1a; Originator&#xff1a;創建和管理備忘錄的對象。 Memento&#xff1a;存儲 Originator 狀態的備忘錄對象…

品牌設計理念和logo設計方法

一 品牌設計的目的 設計是為了傳播&#xff0c;讓傳播速度更快&#xff0c;傳播效率更高&#xff0c;減少宣傳成本 二 什么是好的品牌設計 好的設計是為了讓消費者更容易看懂、記住的設計&#xff0c; 從而輔助傳播&#xff0c; 即 看得懂、記得住。 1 看得懂 就是讓別人看懂…

樹莓派|采集視頻并實時顯示畫面

1、使用SSH遠程連接到樹莓派 2、新建存放代碼的目錄 mkdir /home/pi/my_code_directory 3、進入存放代碼的目錄 cd /home/pi/my_code_directory 4、新建py文件 nano cv2test.py 5、輸入代碼 import cv2# 打開攝像頭 cap cv2.VideoCapture(0)while True:# 讀取視頻幀ret…

BGP學習二:BGP通告原則,BGP反射器,BGP路徑屬性細致講解,新手小白無負擔

目錄 一.AS號 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原則 1.只發布最優且有效的路由 2.從EBGP獲取的路由&#xff0c;會發布給所有對等體 3.水平分割原則 4.IBGP學習BGP默認不發送給EBGP&#xff0c;但如果也從IGP學習到了這條路由&#xff0c;就發…

mysql 幻讀,臟讀和不可重復讀

MySQL的臟讀、幻讀和不可重復讀是數據庫事務處理中的三種常見問題&#xff0c;它們都涉及到數據的一致性和并發性。一&#xff0c;臟讀 臟讀是指一個事務讀取了另一個事務未提交的數據。這可能導致數據不一致的問題。 例如&#xff1a; 用戶user1的初始balance是100&#xff0…

java項目之智慧圖書管理系統設計與實現(springboot+vue+mysql)

風定落花生&#xff0c;歌聲逐流水&#xff0c;大家好我是風歌&#xff0c;混跡在java圈的辛苦碼農。今天要和大家聊的是一款基于springboot的智慧圖書管理系統設計與實現。項目源碼以及部署相關請聯系風歌&#xff0c;文末附上聯系信息 。 項目簡介&#xff1a; 智慧圖書管理…

SOCKET編程(5):IO復用

IO復用 多進程/線程并發模型&#xff0c;為每個sockets分配一個進程/線程 I/O&#xff08;多路&#xff09;復用&#xff0c;采用單個進/線程就可以管理多個socket I/O復用有3種方案&#xff1a; selectpollepoll select I/O多路復用詳解 27、fd_set與FD_SETSIZE詳解 詳解…

新聞資訊微信小程序開發后端+php【附源碼,文檔說明】

博主介紹&#xff1a;?IT徐師兄、7年大廠程序員經歷。全網粉絲15W、csdn博客專家、掘金/華為云//InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3…

管理科學SCI、SSCI雙檢索,自引率低,無預警風險,對國人相當友好!

一、期刊名稱 Journal of Organizational and End User Computing 二、期刊簡介概況 期刊類型&#xff1a;SSCI 學科領域&#xff1a;管理學 影響因子&#xff1a;6.5 中科院分區&#xff1a;2區 出版方式&#xff1a;開放出版 版面費&#xff1a;$3300 三、期刊征稿范圍…

探秘錢塘高中,筑夢未來之旅————杭州市錢塘高級中學

晨曦微露&#xff0c;書生瑯瑯&#xff0c;古韻今風交織在這方學府&#xff0c;滔滔的錢塘江畔&#xff0c;杭州市錢塘高級中學屹立于此。這所學校自1958年建校伊始&#xff0c;走過幾十年的光輝歲月&#xff0c;一直致力于提供優質的教育資源。 近年來&#xff0c;學校獲得多項…

Learning C# Programming with Unity 3D

作者&#xff1a;Alex Okita 源碼地址&#xff1a;GitHub - badkangaroo/UnityProjects: A repo for all of the projects found in the book. 全書 686 頁。

Java常見數據結構---八大結構

前言&#xff1a; 數據結構是計算機底層存儲、組織數據的方式。是指數據相互之間是以什么方式排列在一起的。 通常情況下&#xff0c;精心選擇的數據結構可以帶來更高的運行或者存儲效率 常見的八大數據結構&#xff1a; 棧&#xff1a; 思想&#xff1a; 棧是一種數據結構&…