青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

[Tips][Original] qsort應用于指針數組與二維數組(字符)的差異

在將qsort函數應用于對指針數組與二維數組排序時,傳遞給compare函數的參數類型是不同的

首先,我們舉個簡單的例子,先將qsort對整數數組排序:
 1 int
 2 cmp(const void *arg1, const void *arg2)
 3 {
 4     return (*(int *)arg1)-(*(int *)arg2);
 5 }
 6 
 7 int
 8 main(int argc, char **argv)
 9 {
10     int i;
11     int arr[] = {31524};
12     qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(int), cmp);
13 }
排序針對的是數組里的元素而言的,這里整數數組的元素就是整數,因此qsort的第三個參數就是sizeof(int),而傳遞給比較函數cmp的參數就是相對應的指向整數的指針

接著,我們來看看指針數組的情形:
 1 int
 2 cmp(const void *arg1, const void *arg2)
 3 {
 4     return strcmp((*(char **)arg1), (*(char **)arg2));
 5 }
 6 
 7 int
 8 main(int argc, char **argv)
 9 {
10     int i;
11     /* pointer array */
12     char *str[] = {"java""c""python""perl"}; 
13     qsort(str, sizeof(str)/sizeof(str[0]), sizeof(char *), cmp);
14 }
這里的理解其實跟整數數組差不多,關鍵是抓住數組里元素的類型,既然稱之為指針數組,那數組元素的類型自然就是指針,因此qsort的第三個參數就是sizeof(char *),而傳遞給比較函數cmp的參數就是相對應的指向指針的指針,這里即char **類型

二維數組的理解最為復雜,代碼如下:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 int
 6 cmp1(const void *arg1, const void *arg2)
 7 {
 8     return strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2)));
 9 }
10 
11 int
12 cmp2(const void *arg1, const void *arg2)
13 {
14     return strcmp((char *)arg1, (char *)arg2);
15 }
16 
17 int
18 main(int argc, char **argv)
19 {
20     int i;
21     char str1[4][8= {"java""c""python""peal"};
22     printf("COMPARE-FUNCTION-1\n");
23     qsort(str1, 4sizeof(str1[0]), cmp1);
26 
27     char str2[4][8= {"java""c""python""peal"};
28     printf("COMPARE-FUNCTION-2\n");
29     qsort(str2, 4sizeof(str2[0]), cmp2);
34 }
這里cmp1與cmp2都能正常的工作(*^__^*) 嘻嘻……
還是按照上述方法來分析,抓住數組元素的類型來入手,二維數組實際上就是數組的數組,因此二維數組的元素類型就是一維數組,因此qsort的第三個參數就是sizeof(str1[0])或sizeof(str2[0]),那傳遞給比較函數的參數應該就是指向數組的指針,這點可以通過gdb設置斷點來得到證實:
 1 (gdb) p &str1[0]
 2 $1 = (char (*)[8]) 0xbffff2cc
 3 (gdb) p &str1[1]
 4 $2 = (char (*)[8]) 0xbffff2d4
 5 
 6 Breakpoint 2, cmp1 (arg1=0xbffff2cc, arg2=0xbffff2d4) at char_test2.c:8
 7 8        return strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2)));
 8 (gdb) p arg1
 9 $3 = (const void *0xbffff2cc
10 (gdb) p arg2
11 $4 = (const void *0xbffff2d4
12 (gdb) p *(char (*)[])arg1
13 $5 = "j"
14 (gdb) p *(char (*)[8])arg1
15 $6 = "java\000\000\000"
通過第2行與第9行的比較可以發現,比較函數的參數arg1其實就是&str1[0],類型為char (*)[],這也是為什么cmp1能正常工作的原因
那么cmp2呢,它為什么正確呢?
在cmp1中:strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2))); 這里傳遞給strcmp的參數之所以不會出錯,是因為我們將arg1解地址操作獲得一個數組,而數組名其實是指向數組首元素的指針,arg1既然是指向str1[0]這個一維數組的指針,而str1[0]本身其實就是指向這個一維數組的指針,也就是說arg1其實就是str1[0],因此cmp2能夠正常工作
1 (gdb) p &str1[0]
2 $3 = (char (*)[8]) 0xbffff2cc
3 (gdb) p &str1[0][0]
4 $4 = 0xbffff2cc "java"
5 (gdb) p arg1
6 $5 = (const void *0xbffff2cc
7 (gdb) p (char *)arg1
8 $6 = 0xbffff2cc "java"

額...貌似越說越復雜的樣子,不過這是我理解的過程,見諒...

posted on 2010-10-29 15:09 simplyzhao 閱讀(2198) 評論(0)  編輯 收藏 引用 所屬分類: A_排序

導航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            猛男gaygay欧美视频| 亚洲三级视频| 国产色综合网| 欧美特黄一区| 国产精品www| 国产精品自拍小视频| 国产亚洲精品自拍| 国产亚洲免费的视频看| 极品尤物一区二区三区| 一区二区三区在线观看欧美| 亚洲第一页自拍| 日韩视频亚洲视频| 中国亚洲黄色| 久久女同互慰一区二区三区| 老司机午夜精品视频| 亚洲第一综合天堂另类专| 亚洲欧洲日本mm| 亚洲综合色自拍一区| 久久精品视频免费播放| 男女av一区三区二区色多| 欧美日韩国产免费观看| 国产偷国产偷亚洲高清97cao | 久久精品成人一区二区三区蜜臀 | 亚洲精品黄网在线观看| 亚洲视频在线观看免费| 久久天天狠狠| 国产一区二区视频在线观看| 国产欧美日本| 亚洲区一区二| 亚洲国产色一区| 欧美高清不卡在线| 欧美午夜视频在线| 国产日韩欧美91| 99av国产精品欲麻豆| 久久精品一区四区| 亚洲精品九九| 久久久一本精品99久久精品66| 欧美成人黑人xx视频免费观看| 欧美日韩在线播放| 亚洲黄一区二区三区| 久久精品官网| 亚洲一区二区三区成人在线视频精品 | 日韩亚洲欧美一区| 久久久久这里只有精品| 亚洲视频在线观看免费| 欧美极品aⅴ影院| 亚洲国产va精品久久久不卡综合| 午夜精品影院在线观看| 亚洲精品日产精品乱码不卡| 久久精品综合| 国产一区二区三区奇米久涩 | 99热在线精品观看| 久久久成人精品| 猫咪成人在线观看| 一区二区三区视频在线看| 欧美在线一二三区| 欧美日韩一区二区三区在线观看免| 伊人婷婷欧美激情| 久久精品观看| 欧美一区二区三区视频在线| 国产精品国产精品| 在线午夜精品| 日韩视频不卡中文| 欧美精品在线观看| 夜夜爽www精品| 亚洲免费电影在线观看| 欧美三级在线视频| 亚洲一区二区三区中文字幕在线| 亚洲免费大片| 国产精品爽爽ⅴa在线观看| 欧美h视频在线| 亚洲欧美春色| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧美精品suv| 亚洲性感激情| 国产一区二区三区在线免费观看| 久久久爽爽爽美女图片| 久久精品视频在线播放| 激情久久五月天| 卡通动漫国产精品| 男人的天堂亚洲在线| av成人福利| 亚洲裸体在线观看| 久久国产日本精品| 亚洲大片一区二区三区| 亚洲电影成人| 国产精品视频一二| 欧美大尺度在线| 欧美三级不卡| 久久免费视频在线| 欧美成人第一页| 亚洲欧美久久| 久久综合九色综合欧美狠狠| 亚洲免费激情| 午夜精品三级视频福利| 在线观看久久av| 亚洲精品美女免费| 国产欧美日韩精品一区| 久久婷婷亚洲| 欧美国产日本| 久久精品女人| 欧美日韩一区二区三区高清| 久久成人综合视频| 蜜臀av一级做a爰片久久| 亚洲综合国产精品| 美腿丝袜亚洲色图| 欧美资源在线观看| 欧美日韩成人一区| 欧美h视频在线| 国产午夜亚洲精品羞羞网站| 亚洲国产视频一区| 国产一区二区在线免费观看| 亚洲日韩中文字幕在线播放| 红桃视频一区| 亚洲专区国产精品| 在线天堂一区av电影| 国产欧美一区二区在线观看| 欧美国产日本在线| 国产欧美不卡| 中日韩午夜理伦电影免费| 91久久精品国产91久久性色tv| 亚洲专区一区| 午夜精品视频在线| 国产精品高潮呻吟久久av黑人| 亚洲大片一区二区三区| 国产自产在线视频一区| 亚洲一区二区成人在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲欧美影院| 亚洲欧洲99久久| 欧美午夜视频| 在线亚洲成人| 亚洲尤物在线| 亚洲乱码视频| 在线观看成人av电影| 午夜久久资源| 西西裸体人体做爰大胆久久久| 欧美美女喷水视频| 最新日韩中文字幕| 亚洲精品久久久蜜桃| 美国成人直播| 亚洲国产精品久久人人爱蜜臀| 在线成人激情黄色| 久久久欧美精品sm网站| 麻豆精品视频| 91久久国产综合久久91精品网站| 久久国产精品高清| 久久久久久网址| 亚洲免费在线视频| 欧美日韩在线亚洲一区蜜芽| 欧美激情在线| 日韩亚洲在线观看| 欧美精品国产精品日韩精品| 欧美多人爱爱视频网站| 亚洲高清一二三区| 欧美国产日韩一二三区| 亚洲九九爱视频| 亚洲一区二区三区精品视频| 欧美午夜宅男影院在线观看| 亚洲视频中文字幕| 久久精品国产亚洲5555| 在线不卡中文字幕| 欧美精品v国产精品v日韩精品| 亚洲精品视频在线播放| 亚洲性视频网址| 国产午夜精品全部视频在线播放 | 99这里只有精品| 国产精品xxxxx| 久久爱www久久做| 亚洲国产综合视频在线观看| 亚洲美女一区| 国产欧美日韩精品一区| 在线观看亚洲视频| 久久亚洲风情| 在线观看91久久久久久| 欧美福利电影网| 亚洲一区二区三区免费观看| 久久久美女艺术照精彩视频福利播放 | 亚洲一区欧美| 欧美成人亚洲| 亚洲午夜精品一区二区| 国产一区自拍视频| 欧美欧美在线| 久久久激情视频| 这里只有视频精品| 欧美电影电视剧在线观看| 久久精品日韩欧美| 国语自产精品视频在线看| 免费久久精品视频| 亚洲欧美国产日韩中文字幕| 免费一区二区三区| 亚洲愉拍自拍另类高清精品| 亚洲国产欧美国产综合一区| 国产精品乱码久久久久久| 久久性色av| 欧美在线3区| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久精品日韩欧美| 亚洲视频网站在线观看| 激情综合自拍|