題目
如題
思路
其實(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ù)說明:文章來源:http://www.zghlxwxcb.cn/news/detail-669995.html
base:指向需要排序的數(shù)組的指針,數(shù)組中每個元素的大小應(yīng)為 size 字節(jié)。
nitems:數(shù)組中的元素個數(shù)。
size:每個元素的大小(以字節(jié)為單位)。
compar:指向一個比較函數(shù)的指針。該函數(shù)用于比較兩個元素的大小關(guān)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-669995.html
代碼
#include<stdio.h>
#include<stdlib.h>
//比較函數(shù),也是qsort函數(shù)需要的指針參數(shù)指向的函數(shù)
int compare(const void * a, const void * b);
int main()
{
int sz[5] = {1,5,2,6,4};//待排序的數(shù)組
int (*compar)(const void *, const void *);//函數(shù)指針compar
int * ps = sz;//指針指向sz數(shù)組
int i;
compar = compare;//指針指向compare函數(shù)
qsort(ps, 5, 4, compar);//調(diào)用 qsort 函數(shù)
for (i=0;i<5;i++)
{
printf("%d ",sz[i]);
}//打印排序結(jié)果
return 0;
}
int compare(const void * a, const void * b)
{
int num1 = *(const int *)a;//void轉(zhuǎn)換類型后才能使用
int num2 = *(const int *)b;
if (num1 > num2)
{
return 1;
}
if (num1 < num2)
{
return -1;
}
if (num1 == num2)
{
return 0;
}
}
感悟
- 要注意調(diào)用一個函數(shù)一定要嚴(yán)格按照它參數(shù)的函數(shù)類型來填充參數(shù),比如說這里 qsort 函數(shù)的一個參數(shù)是 int (*compar)(const void *, const void *),那么這個參數(shù)是函數(shù)指針,函數(shù)指針的類型 int ,以及它的參數(shù)類型是 const void *,這兩個類型是一點(diǎn)都不能變的。但是在填充函數(shù)指針這個參數(shù)的時候可以選擇填充 函數(shù)指針名 和 函數(shù)名,因?yàn)楫?dāng)函數(shù)指針指向一個函數(shù)以后,這個函數(shù)指針名 和 函數(shù)名 就可以互換使用了(只是用法差不多)。
- 詳細(xì)理解了 void * 類型的變量怎么使用:比如這里想把把它作為一個比較函數(shù)的參數(shù)使用,而且我想的是這兩個數(shù)是 int 類型的,但有一點(diǎn)是 void * 類型的變量不轉(zhuǎn)換類型是無法使用的,所以我要把 void * 類型的變量轉(zhuǎn)換為 int 類型的變量:int num = *(const void *) a;
- 首先,這個程序最后寫的 compare 函數(shù)參數(shù)的意義是指向數(shù)組元素的指針,然后這個函數(shù)可以進(jìn)行簡化,讓程序來判斷元素大小:
int compare(const void * a, const void * b)
{
return (*(const int *)a - *(const int *)b);
}
到了這里,關(guān)于C語言題目 - 調(diào)用qsort函數(shù)對數(shù)組進(jìn)行排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!