亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

還有cmp函數中*(int*)a是什么意思?求大神解答

還有cmp函數中*(int*)a是什么意思?求大神解答

#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){return *(int *)a - *(int *)b;}int main(void){int i,n,a[100];scanf("%d",&n);for (i=0;i<n;i++) scanf("%d",&a[i]);qsort(a,n,sizeof(a[0]),cmp);for (i=0;i<n;i++) printf("%d ",a[i]);return 0;}如以上程序,我們定義了的cmp帶有2個參數,但是下面調用的時候卻不需要帶參數,這是為什么?
查看完整描述

3 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

因為cmp在傳入qsort的時候是作為函數指針傳入的,qsort在調用cmp(就是“回調函數”)的時候會傳入合適的參數。

*(int*)a是因為:a是個void *類型,要先用(int*)將它轉成int*類型,然后再用*取值,變成int類型,才能比較大小。

查看完整回答
反對 回復 2022-11-22
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

你這個 cmp和qsort中的cmp是一樣的寫法  應該說 qsort在排序的時候 會自動為cmp賦值參數 因為qsort中的cmd的參數原型就是這樣的 這是他內部的比較機制 也就是這么規定的

對于下面的


int cmp(const void *a,const void *b){     return *(int *)a - *(int *)b; }

中的*(int*)a      可以看到 由于cmp函數要返回的int  切參數a,b都是指針形式的 但是不知道類型

所以比較的時候進行強制轉換為int型的指針 然后通過括號外的*取得各自的int值大小進行各自變量的差值運算 得出各自變量的大小 后返回供 qsort內部調用   這些其實都是在qsort內部完成的  你的提問很好  很好的剖析了他的原理 共勉

 


查看完整回答
反對 回復 2022-11-22
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

頭文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的占用空間大小
4 指向函數的指針,用于確定排序的順序
#########################################
qsort(a,n,sizeof(a[0]),cmp); // cmp是一個回調函數,我們必需按照qsort的函數聲明中約定好的形式定義并且實現該函數,也就是說qsort需要的是一個函數指針,而函數名恰恰就是
########################################
*(int *)a // 因為a的類型是 void * ,先進行強制類型轉換為 int *, 然后取值做差

查看完整回答
反對 回復 2022-11-22
  • 3 回答
  • 0 關注
  • 339 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號