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

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年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

統計

常用鏈接

留言簿(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>
            久久裸体艺术| 国产一区二区三区精品欧美日韩一区二区三区 | 韩国av一区| 欧美日韩小视频| 欧美成年人在线观看| 久久久青草青青国产亚洲免观| 久久久欧美一区二区| 欧美精品亚洲二区| 国产伦精品一区二区三区视频黑人| 国产欧美日韩精品在线| 国产一区二区三区久久悠悠色av| 影音先锋中文字幕一区| 9l视频自拍蝌蚪9l视频成人| aa级大片欧美| 久久精品欧洲| 蜜桃av久久久亚洲精品| 欧美激情一区二区三区高清视频| 亚洲深夜激情| 久久精品色图| 欧美人与性禽动交情品| 国产麻豆一精品一av一免费| 在线成人欧美| 亚洲视频网站在线观看| 久久人体大胆视频| 日韩小视频在线观看专区| 香蕉成人伊视频在线观看| 免费中文字幕日韩欧美| 国产精品私拍pans大尺度在线 | 欧美日韩精品系列| 国产又爽又黄的激情精品视频| 亚洲激情视频在线播放| 亚洲综合电影| 亚洲国产另类精品专区| 亚洲精品中文字幕女同| 久久久777| 国产精品影片在线观看| 亚洲精品国产精品久久清纯直播| 亚洲欧美激情四射在线日| 亚洲电影免费| 久久久久国产成人精品亚洲午夜| 国产精品国产三级国产普通话蜜臀 | 亚洲激情校园春色| 欧美在线免费观看| 亚洲人午夜精品免费| 欧美综合激情网| 欧美高清在线观看| 激情综合五月天| 久久爱www久久做| 亚洲视频第一页| 欧美日韩免费高清| 日韩西西人体444www| 欧美激情a∨在线视频播放| 久久久久国色av免费观看性色| 国产视频一区在线| 欧美一区二区在线播放| 亚洲一级片在线观看| 国产精品theporn88| 亚洲一级黄色av| 一本色道久久88亚洲综合88| 欧美日韩高清在线一区| 亚洲麻豆av| 亚洲精品视频一区二区三区| 欧美.日韩.国产.一区.二区| 亚洲二区视频在线| 欧美激情网站在线观看| 久久亚洲精品中文字幕冲田杏梨| 好吊色欧美一区二区三区视频| 欧美国产视频在线| 1024国产精品| 美女被久久久| 蜜桃av一区二区三区| 亚洲黄色小视频| 亚洲第一中文字幕| 欧美日韩国产一区二区三区地区 | 亚洲精品在线观看免费| 欧美激情视频一区二区三区免费| 久久蜜臀精品av| 亚洲精品久久| 一本久久综合| 国产欧美日韩亚洲| 美女免费视频一区| 欧美不卡视频一区| 亚洲无玛一区| 欧美一区二区三区免费大片| 伊人久久综合97精品| 亚洲人成艺术| 国产欧美综合一区二区三区| 久久亚洲一区二区三区四区| 久久综合色88| 亚洲永久免费视频| 久久一区亚洲| 亚洲免费影视| 免费高清在线一区| 午夜精品剧场| 欧美丰满高潮xxxx喷水动漫| 午夜久久tv| 欧美国产日韩一区二区三区| 欧美尤物一区| 欧美jizzhd精品欧美喷水| 亚洲欧美99| 欧美成人四级电影| 久久国产欧美| 欧美视频免费看| 欧美大片第1页| 国产亚洲精品bt天堂精选| 亚洲国产高清在线| 国产在线欧美日韩| 亚洲天堂激情| 亚洲精品国产精品国自产观看浪潮 | 欧美在线视频免费观看| 狼人社综合社区| 欧美中文字幕第一页| 欧美精品久久久久久久| 久久人人爽人人| 国产欧美日韩亚洲| 一本一本a久久| 亚洲经典视频在线观看| 欧美一级播放| 先锋影音国产一区| 欧美视频免费看| 亚洲国产成人av| 在线观看国产日韩| 欧美在线视频不卡| 性高湖久久久久久久久| 欧美日韩欧美一区二区| 亚洲国产91精品在线观看| 一区二区在线观看视频| 欧美日韩精品欧美日韩精品一| 99视频精品在线| 老牛影视一区二区三区| 久久精品午夜| 国产香蕉久久精品综合网| 一区二区免费在线观看| 亚洲无线观看| 国产精品色在线| 亚洲一区二区三区午夜| 亚洲影音先锋| 国产精品99一区| 一区二区三区欧美视频| 亚洲一区免费网站| 国产精品久久久久aaaa九色| 亚洲国产精品高清久久久| 亚洲高清在线| 欧美成在线观看| 亚洲福利视频免费观看| 亚洲麻豆av| 国产精品成人播放| 亚洲一级一区| 久久久亚洲一区| 在线日韩欧美| 欧美精品国产一区| 亚洲免费观看在线观看| 一本久久知道综合久久| 欧美三级乱人伦电影| 亚洲永久免费av| 久久久久久久综合狠狠综合| 黄色一区二区在线观看| 欧美粗暴jizz性欧美20| 夜夜精品视频| 久久久久久久成人| 亚洲激情网站| 国产精品久久影院| 欧美一区二区视频免费观看| 欧美a级片网| 亚洲网站在线| 精品动漫3d一区二区三区免费版| 女人天堂亚洲aⅴ在线观看| 99re6热只有精品免费观看 | 欧美88av| 午夜国产一区| 亚洲国产高清一区二区三区| 欧美日产国产成人免费图片| 亚洲女优在线| 亚洲国内精品在线| 欧美一区二区三区精品| 亚洲国产综合91精品麻豆| 欧美性事免费在线观看| 久久久久久久久久码影片| 亚洲国产精品久久久久婷婷884| 亚洲午夜在线观看| 伊人久久大香线| 国产精品日韩| 欧美精品免费看| 久久精品盗摄| 99精品福利视频| 欧美成人免费在线| 西瓜成人精品人成网站| 亚洲精品美女在线观看播放| 国产精品欧美一区二区三区奶水| 美女免费视频一区| 亚洲欧美一区二区三区久久| 欧美夫妇交换俱乐部在线观看| 亚洲欧美美女| 日韩小视频在线观看| 激情成人亚洲| 国产精品久久久久一区二区三区共| 免费成人av资源网| 久久国产精品免费一区| 欧美一区激情| 欧美色欧美亚洲另类二区|