C语言中函数不是变量,单可以定义指向函数的指针,这种类型的指针可以被赋值存放在数组中,传递给函数以及作为函数的返回值等.
前面的函数定义先不用看.
进入主函数.
首先判断参数数量,并且判断是否是-n.这里的判断很奇葩啊判断strcmp的返回值是不是0.
然后将状态变量设置为1.
然后readlines读取输入行,并将首字符的指针放到lineptr中.返回值为行数.这里的函数之前都有.
OK到了qsort函数,这个函数需要说的东西很麻烦啊,首先是声明,void,这个类型书上没有写,这个就是传说中指向指针的指针,首先需要分解一下,void是指向void类型的指针,是一个地址,访问这个地址就会取得这个地址的数据,而void是指向之前那个地址的地址.就是说void指向的是void的地址,void*又指向了一个void类型的值.转网上的一段解释能更好的理解.
void* 是说: 这是一个指针,它指向任何类型的对象.
void** 是说: 这是一个指针,它指向一个void* 型的指针.这个void *的指针又指向任何类型的对象
比如找人一样。这个人是李四
void * pdes;就好像某人的住址一样。你到他家就可以找到他了。
但是他爸说,这小子已经被我卖了,成了张三的儿子。他爸告诉你张三家的住址,然后你去张三家就可以找到李四了。
张三的地址就是
void ** ppdes;
如果张三说,已经把李四又卖了武大。
于是就又要变成
void *** pppes;
就是上面这样,因为linesptr是指针数组,其中的元素都是指针,所以想访问这些指针所指向的内容,就需要这种多级指针的声明.
后面两个参数是整数,不考虑.
然后第四个参数,首先int返回值为整数,然后()这个东西说明是一个指向函数的指针.后面带个括号(void,void)是这个函数的参数,带的两个void类型的参数.(这里是强制类型转换的类型,意思是将之后的那个函数强制转换成这个类型.也就是全是void的类型)*
writelines就是按顺序输出.
然后是错误信息.
关于排序函数 之前也算是讲过.
就是把交换的判断依据变成了(*comp)(v[i], v[left]<0 )而这个实际的函数就是那连个numcmp或者strcmp.
就是通过对比两个字符串,前者大于后者返回正数,前者小于后者返回负数.等于返回0.
如果后者小于前者(<0)的情况下,交换两个元素的位置.
然后引用自身.
numcmp就是把字符串强制转换成正数,然后比较后返回相应的数.