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

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

0

6个回答

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

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

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

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

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

0

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

0
lizhongyu
仲宇 你先看看书吧。int (*compar)(const void*,const void*))就是函数指针的定义方式。
一年多之前 回复
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*的函数地址
一年多之前 回复
xuezha009
xuezha009 qsort 的最后一个参数是个函数地址 为啥啊 怎么判断出来 的 原谅我渣
一年多之前 回复

推荐你去看《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)

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

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的函数。
快排是基于回调函数的,你已经先去理解回调函数。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言标准库函数源码大全 (24M涵盖所有库函数)(GLIBC源码)
C语言标准库函数源码大全(24M涵盖所有库函数) ,相当全的库函数源码! 如标准 printf scanf 字符类处理等,各种源码库函数,是学习C语言,精通C语言的必备良药!平时项目参考相当给力!(GLIBC源码)
c语言标准库函数源码
c语言标准库函数源码
C语言标准库函数源码大全 (24M涵盖所有库函数)
C语言标准库函数源码大全 (24M涵盖所有库函数)
C标准库(中+英+库函数源代码)(中英文版皆含目录)
中英文皆为高清版,非扫描,有目录。附上C标准库函数源码。
C语言标准函数库源码
C语言标准库函数源码大全(24M涵盖所有库函数) ,相当全的库函数源码! 如标准 io ,字符类处理等,各种源码库函数,是学习C语言,精通C语言的必备良药!平时项目参考相当给力!
c语言库函数chm
c语言chm,所有库函数都包括了,下了很多csdn其他的资源都是不完整的。最后某大神分享给我了
iscntrl ( )【C语言库函数源代码】
【C语言库函数源代码】【本程序在Dev C++ 4.9.9.2 下编译通过】int my_iscntrl( int ch ) {    return (unsigned int)ch   ||  ch == 127;}//判断字符c是否为控制字符。当c在0x00-0x1F之间或等于0x7F(DEL)时,返回非零值,否则返回零。int main(){   char c
C语言标准库函数 C语言标准库函数
C语言标准库函数C语言标准库函数C语言标准库函数C语言标准库函数C语言标准库函数C语言标准库函数C语言标准库函数
常用ANSI C语言标准库函数汇总(一)
常用ANSI C语言标准库函数汇总(一)C语言被发明出来时并没有什么库函数,随着C语言的流行,越来越多的厂商和组织开始提供C语言的编译器,同时把经常用到的函数封装成“库”的形式发布。后来,美国国家标准协会(ANSI)制定了C语言的标准,同时也制定了一定数量的库,称之为ANSI C语言标准函数库。本文将简要介绍以下几种常见库函数的汇总。(所有函数名按照首字母顺序排列) 数学函数 字符函数 字符串函数*
常用C语言标准库函数
常用C语言标准库函数常用C语言标准库函数常用C语言标准库函数常用C语言标准库函数常用C语言标准库函数
常用C语言标准库函数常用C语言标准库函数
常用C语言标准库函数常用常用C语言标准库函数C语言标准库函数常用C语言标准库函数
整理网上资料---C标准库值篇二 :标准库源码下载地址、标准库手册下载地址
C标准库源码及手册.zip,包括:
C语言标准库函数
C语言标准库函数,包括了我们常用的数学计算函数还有文件IO,字符串的操作函数
C语言标准库函数的理解与重写
1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove 为了更好的去理解这几个函数的用法,自己去实现一下功能,才能更好的学习 #include&amp;lt;assert.h&amp;gt; size_t Strlen(const char* str){ //无符号整型 assert(str !...
glibc-linux C 标准库函数源码
linux C标准库函数源码可以从GNU官网上免费下载,下面是地址: ftp://ftp.gnu.org/gnu/glibc
C语言标准库函数大全
常用的C语言标准库函数,方便,可操作性强,易于使用。
C语言标准库函数的源代码
C语言标准库函数的源代码,拿出来大家分享
初来乍到,请各位大佬多多指教!!!
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...
C语言文件操作标准库函数与Linux系统函数效率比较
我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open()、close()、write()、read()等,而标准C语言的库函数中也有一套对文件的操作函数fopen()、fclose()、fwrite()、fread()等.。那么同样是对文件的操作函数,标C与UC有什么区别呢?是标C效率高还是UC效率高呢?今天就让我们来一探究竟。程序作用:将0~999999这
看源码,看源码,看源码!--所有C语言函数的源代码
在D:\Program Files\visual studio\VC\crt\src 目录下面。这个目录下面包含所有C语言函数的源代码。 http://www.cnblogs.com/youxin/p/3270974.html如strcat函数定义:char *strcat (char *dest,const char *src) 函数说明:strcat()会将参数src字符串拷贝到参数dest
C语言库函数查询手册.chm
资源描述:(放心中文版的) ---------------------- c参考手册.rar(压缩包) 内含:C参考手册.chm(最全的一个) C函数查询.chm C语言库函数速查手册.chm C语言标准库函数大全.chm C语言100例.chm(100个例子) C语言库函数速查手册.chm(按字母排列) 这六个是我找了好久才找到的,各有各的好处,前3个互补十分齐全,后三个作为前三个的补充 函数不用说 程序例子 优先级表 ASCII码表 转义字符 关键字大全及注释 预处理命令 数据类型说明 c++模板库 。。。 。 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ 标准模板库 C++ Bitsets C++ Double-Ended Queues C++ Lists C++ Maps C++ Multimaps C++ Multisets C++ Priority Queues C++ Queues C++ Sets C++ Stacks C++ Vectors Iterators 等等 这是对于新手、老手都不可错过的好东西!!
C/C++中的标准库函数总结
C 语言中有大量的标准库函数,根据功能不同,声明于不同的头文件中。这些库函数在C++中也能使用。总结了常用的库函数
C语言库函数速查手册.chm
C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册C语言库函数速查手册
C语言库函数大全.CHM
C语言库函数代码。
C语言中一些有关于字符串的库函数 ( 源函数 )
strlen  计算字符串大小 // 计数器方法 int my_strlen(const char * str) { int count = 0; while(*str) { count++; str++; } ...
【C++】C语言标准库以及标准头文件
静态链接库(Static Link Library)——   Linux 下的 .a 和 Windows 下的 .lib。     ANSI C 标准共定义了 15 个头文件,称为“C标准库”,所有的编译器都必须支持,如何正确并熟练的使用这些标准库,可以反映出一个程序员的水平: 合格程序员:&amp;lt;stdio.h&amp;gt;、&amp;lt;ctype.h&amp;gt;、&amp;lt;stdlib.h&amp;gt...
Standard C 语言标准函数库速查 (Cheat Sheet)
Standard C 语言标准函数库速查 (Cheat Sheet) tmpnam 函数说明 函数名: tmpnam  功  能: 创建一个唯一的文件名  用  法: char *tmpnam(char *sptr);  程序例:  #include   int main(void)  {     char name[13];     tmpna
C语言函数大全 chm含示例
C语言函数大全chm版,里面的一些代码者是语法着色的,看着很舒服,这个函数大全以a-z的字母顺序列出了所有C语言中的函数用法、代码示例,如果你对C语言编程感兴趣,那么这本函数手册绝对不可以错过的。 下载地址:点击下载 备用下载地址:点击下载 下载地址:点击下载 ...
自己写C语言一些基本函数,比标准库实现简单,提高嵌入式效率
嵌入式领域,效率为王,C标准库里一个printf都万行代码,虽然强大,但不一定全部用上,有时候自己重构的函数,虽然不够强大,通用性也不好,但是,效率为王,韦老师写的,分享出来大家看,CSDN帮我很多,也要回馈一下
C语言的标准库概述
C语言的标准库包括15个部分,每一个部分都有一个头描述。标准头主要由函数原型、类型定义以及宏定义组成。如果使用了标准库中的函数,就要将相应的标准头使用#include包含进来。
分享一位大佬的学习手册
在GitHub上无意中发现一位为了入职Google而准备的学习手册,粗略一看,深感佩服,获益颇多,故转发一波,希望与大家共勉。 [译] Google Interview University 一套完整的学习手册帮助自己准备 Google 的面试 原文地址:Google Interview University 原文作者:John Washam 译文出自:掘金翻译计划 译...
C语言标准库函数C语言标准库函数
C语言标准库函数查询,中文版整理,希望大家喜欢。
C/C++库函数api手册
C/C++库函数api手册 包含C和C++库函数的一些资料,整理得还比较细。虽然没有包含全部,但是大部分常用的都包含了
C语言库函数
C语言标准库函数简介。
pow ( )【C语言库函数源代码】
【C语言库函数源代码】【本程序在Dev C++ 4.9.9.2 下编译通过】double my_pow(double x, double y){   register double ret, value;   double r = 1.0;   long p = (long) y;    if (x == 0.0 && y > 0.0)      return
C/C++常用库函数
一篇我写了很久的C/C++常用库函数,还请大佬们不断完善~~
C standard library(标准库函数)
自己整理的C语言标准库每个库函数后面都有实例 对于想了解库函数的都可以看看 通过翻墙去外网扒的资源 可以作为刚接触C语言同学的必备手册
c语言标准库函数大全
c语言标准库函数大全,提供c库函数的参考。
【免积分】GNU最出名的开源C函数库,涵盖了几乎所有的基本函数的源代码
GNU最出名的开源C函数库,涵盖了几乎所有的基本函数的源代码,也可以去一下地址下载http://ftp.gnu.org/gnu/glibc/ http://ftp.gnu.org/gnu/glibc/ ftp://ftp.gnu.org/gnu/glibc/ http://ftp.gnu.org/gnu/ ftp://sources.redhat.com/pub/glibc/releases/
C语言最全函数库
最全的C语言函数库,可以说是非常的好用,希望学习C语言的同学们能用得上.
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java大佬的学习经验 java大佬学习技术