C語言中函數(shù)不是變量,單可以定義指向函數(shù)的指針,這種類型的指針可以被賦值存放在數(shù)組中,傳遞給函數(shù)以及作為函數(shù)的返回值等.
前面的函數(shù)定義先不用看.
進入主函數(shù).
首先判斷參數(shù)數(shù)量,并且判斷是否是-n.這里的判斷很奇葩啊判斷strcmp的返回值是不是0.
然后將狀態(tài)變量設(shè)置為1.
然后readlines讀取輸入行,并將首字符的指針放到lineptr中.返回值為行數(shù).這里的函數(shù)之前都有.
OK到了qsort函數(shù),這個函數(shù)需要說的東西很麻煩啊,首先是聲明,void,這個類型書上沒有寫,這個就是傳說中指向指針的指針,首先需要分解一下,void是指向void類型的指針,是一個地址,訪問這個地址就會取得這個地址的數(shù)據(jù),而void是指向之前那個地址的地址.就是說void指向的是void的地址,void*又指向了一個void類型的值.轉(zhuǎn)網(wǎng)上的一段解釋能更好的理解.
void* 是說: 這是一個指針,它指向任何類型的對象.
void** 是說: 這是一個指針,它指向一個void* 型的指針.這個void *的指針又指向任何類型的對象
比如找人一樣。這個人是李四
void * pdes;就好像某人的住址一樣。你到他家就可以找到他了。
但是他爸說,這小子已經(jīng)被我賣了,成了張三的兒子。他爸告訴你張三家的住址,然后你去張三家就可以找到李四了。
張三的地址就是
void ** ppdes;
如果張三說,已經(jīng)把李四又賣了武大。
于是就又要變成
void *** pppes;
就是上面這樣,因為linesptr是指針數(shù)組,其中的元素都是指針,所以想訪問這些指針所指向的內(nèi)容,就需要這種多級指針的聲明.
后面兩個參數(shù)是整數(shù),不考慮.
然后第四個參數(shù),首先int返回值為整數(shù),然后()這個東西說明是一個指向函數(shù)的指針.后面帶個括號(void,void)是這個函數(shù)的參數(shù),帶的兩個void類型的參數(shù).(這里是強制類型轉(zhuǎn)換的類型,意思是將之后的那個函數(shù)強制轉(zhuǎn)換成這個類型.也就是全是void的類型)*
writelines就是按順序輸出.
然后是錯誤信息.
關(guān)于排序函數(shù) 之前也算是講過.
就是把交換的判斷依據(jù)變成了(*comp)(v[i], v[left]<0 )而這個實際的函數(shù)就是那連個numcmp或者strcmp.
就是通過對比兩個字符串,前者大于后者返回正數(shù),前者小于后者返回負數(shù).等于返回0.
如果后者小于前者(<0)的情況下,交換兩個元素的位置.
然后引用自身.
numcmp就是把字符串強制轉(zhuǎn)換成正數(shù),然后比較后返回相應(yīng)的數(shù).