c语言标准库函数 源代码 没看懂 求大佬们指教 5C

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*))这是标准库快速排序的函数请问为什(*compar)里有*号 为啥啊 int* com我理解是返回一个int型指针 然而快排的*号跟函数名有关 请问为啥啊

6个回答

(*compar)代表的是一个返回值为int,参数表是(const void*,const void*)的一个函数,定义了函数指针后,它是未初始化的,一般还需要将这个函数指针指向另一个函数。

streamlet_h
streamlet_h 回复xuezha009: 函数指针啊,
接近 2 年之前 回复
desert187
lionchan187 回复xuezha009: 函数指针也是指针,c/c++规定定义或声明指针前必须加\*
接近 2 年之前 回复
desert187
lionchan187 回复xuezha009: 函数指针也是指针,c/c++
接近 2 年之前 回复
chenzha9913
「已注销」 回复xuezha009: c++中的函数指针声明就是这样的,类似int (*fun)(int,int);这个样子
接近 2 年之前 回复
chenzha9913
「已注销」 c++中的函数指针声明就是这样的,类似int (*fun)(int,int);这个样子
接近 2 年之前 回复
xuezha009
xuezha009 compar前为啥有*啊
接近 2 年之前 回复

int (*compar)(const void*,const void*) 并不是指compare 是int ,而是 compare是一个函数指针
可以这样理解,*compare=f, int f(const void *,const void
)是一个函数,compare是指向f的一个指针

这是一个函数指针。之所以需要函数指针的原因是,qsort要做到通用性,必须允许调用者去自定义排序的规则。
要自定义排序的规则,最好的办法,是qsort遇到两个元素的时候,通过传入的函数指针反过来调用调用者定义的比较函数。
*compar 这个就是函数指针类型, 你看到qsort内的代码,就有
if (compar(arr[x], arr[y])>0) ...
这样的代码
也就是把它当作函数使用。

hungerboy
hungerboy 调用的话其实使用compar()和*compar()都可以,两种理解。
接近 2 年之前 回复
hungerboy
hungerboy 所以如果要是传实际参数直接传函数名即可。而形式参数要写为指向函数的指针,而指向函数的指针就是这么写的。和其他的像int * foo这样的指针一样。int (*compar)(const void*,const void*)代表compar为一个指向函数的指针,该函数返回一个int,参数为两个空指针。
接近 2 年之前 回复
hungerboy
hungerboy 回复xuezha009: 须知:和数组名代表数组首个元素的地址一样,在C中函数名就代表该函数的地址。
接近 2 年之前 回复
xuezha009
xuezha009 qsort 的最后一个参数是个函数地址 为啥啊 怎么判断出来 的 原谅我渣
接近 2 年之前 回复

qsort 的最后一个参数是个函数地址,函数的原型是int compar(const void*,const void*)这样的。插入参数时写成qsort( base, num, size, compar)。
然后qsort实现中,会调用compar函数进行执行。compar就是回调函数,函数作为参数时需要函数指针变量,也就是说指向函数地址的指针变量。int (*compar)(const void*,const void*))就是这个定义

lizhongyu
仲宇 你先看看书吧。int (*compar)(const void*,const void*))就是函数指针的定义方式。
接近 2 年之前 回复
lizhongyu
仲宇 void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*))定义的最后一个是函数指针int (*compar)(const void*,const void*),意思是这个参数是个指针,指向一个返回值为整形,参数为const void*,const void*的函数地址
接近 2 年之前 回复
xuezha009
xuezha009 qsort 的最后一个参数是个函数地址 为啥啊 怎么判断出来 的 原谅我渣
接近 2 年之前 回复

推荐你去看《C程序设计语言》有中文和pdf,里面有讲解这个函数,大概在函数指针那一块。这是一个指向函数的指针,int (*compar)(const void*,const void*) compar相当于函数名,int是返回值,void 是指参数,这里有2个。使用这样的形式定义qsort,在qsort中的定义是这样
void qsort(void v[], int left, int right, int (*comp)(void *,void *))
{
int i, last;
void swap(int v[], int i, int j);
if (left >= right) /
do nothing if array contains /
return; /
fewer than two elements /
swap(v, left, (left + right)/2); /
move partition elem = =*/
last = left; /* to v[0] /
for (i = left + 1; i <= right; i++) /
partition */
if ((*comp)(v[i], v[left] ) < 0){
swap(v, ++last, i);
}

swap(v, left, last); /* restore partition elem */

for(int i = 0;i < 6; i++)
    printf(" %d", v[i]);
printf("\n");

qsort(v, left, last-1);
qsort(v, last+1, right);

}
然后实际调用的时候,qsrot((void**)lineptr, 0 ,line -1, (int (*)(void*,void*))(isnum ? numcmp: strcmp));
这里的numcmp和strcmp的定义是 int numcmp(char*s, char *t) 和nt strcmp(char *s, char *t)

heeroyuy54
heeroyuy54 回复xuezha009: 地址可以指向任何地方,地址我理解是一个物理上的位置,所以可以是表达为函数
接近 2 年之前 回复
xuezha009
xuezha009 qsort 的最后一个参数是个函数地址 为啥啊 怎么判断出来 的 原谅我渣
接近 2 年之前 回复

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

int (*compar)(const void*,const void*)这个参数是函数指针,指向一个参数为(void* , void*)返回类型为int的函数。
快排是基于回调函数的,你已经先去理解回调函数。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问