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

攀升·Uranus


Something Different,Something New
數(shù)據(jù)加載中……

數(shù)組與指針 熟練c/c++ (七)

        剛看了expert C中對(duì)數(shù)組和指針的詮釋,覺得很講的很精彩,尤其對(duì)這種情況引起的錯(cuò)誤記憶猶新:
file: 1.c
int a[10]={0};

file: 2.c
int
main ()
{
        extern int *a;

        printf ("%d\n", a[0]);
        return 0;
}


            但是當(dāng)我運(yùn)行程序在VC6上時(shí),發(fā)現(xiàn)這個(gè)程序Link時(shí)會(huì)報(bào)錯(cuò),那是不是編譯器更新了呢?
由此轉(zhuǎn)一篇文章詮釋數(shù)組和指針的,作者win_hate , http://bbs.chinaunix.net/viewthread.php?tid=239405

轉(zhuǎn)本貼請(qǐng)把 win_hate 的名字寫上。

略談 c 語言中指針與數(shù)組的區(qū)別

數(shù)組與指針是兩個(gè)不同的概念,即使是從編譯的層面上來看。不過,在很多時(shí)候,兩者的用法極為相似。本文將討論兩者的區(qū)別。


一、理論分析

編譯器在處理指針與數(shù)組的時(shí)候,是區(qū)別對(duì)待的。

對(duì)于指針

int *p;

p 是一個(gè)變量,所以編譯器要為之分配一個(gè)空間。

.comm p, 4

對(duì)于數(shù)組:

int a[10]

a 是一個(gè)地址,編譯器會(huì)為數(shù)組 a 分配一個(gè)空間,但不會(huì)為 a 本身分配空間,在使用到a的地方,會(huì)被替換為一個(gè)地址+屬性,其結(jié)果為一個(gè)"常量指針"。

.comm a, 40

在對(duì)一個(gè)指針變量進(jìn)行 dereferance 的時(shí)候,比如 (*p)。編譯器首先要得到 p 的地址,從中取值,然后把得到的值作為地址,再取值。類似如下匯編:

lea (p), %esi                        /* this is &p */
mov (%esi), %edi                /* this is p */
mov (%edi), %eax                /* this is p[0] */

或者,更簡(jiǎn)單的

mov (p), %esi                        /* this is p */
mov (%esi), %eax                /* and this is p[0] */

相比之下,數(shù)組的引用

int a[10];
a[0];

則省去了取 a 地址的過程,符號(hào) a 代表一個(gè)地址,這個(gè)地址不存放在任何變量中!

lea (a), %esi                    /* this is a */
mov (%esi), %eax                 /* this is a[0] */       

或更簡(jiǎn)單的:

mov (a), %esi                   /* this is a[0] */

熟悉匯編的人,容易從看出,區(qū)別是大的。

二、兩個(gè)例子
第一個(gè)例子,演示 "把數(shù)組聲明為指針" 是如何使程序崩潰的。

file: 1.c
int a[10]={0};

file: 2.c
int
main ()
{
        extern int *a;

        printf ("%d\n", a[0]);
        return 0;
}

運(yùn)行這個(gè)程序,Segmentation fault

在模塊1.c 中, a 被定義為一個(gè)數(shù)組,但在模塊 2.c中,a被聲明為指針。所以編譯器在處理        printf ("%d\n", a[0]) 時(shí):
認(rèn)為 a 是一個(gè)指針,所以先取其地址&a,然而,a  實(shí)際是個(gè)數(shù)組,&a 就是 a本身,所的 &a 是 a 的首地址。
然后編譯器取 指針a的值,這實(shí)際上是 得到的是數(shù)組的第一個(gè)元素 a[0] ,值為0!也就是,編譯器得到了一個(gè) 0 指針,最后,編譯器對(duì)其derefrence,崩潰!

第二個(gè)例子演示“把指針聲明為數(shù)組”如何的到錯(cuò)誤的數(shù)據(jù):

file: 3.c
int *pa = (int *)0;

f ()
{
        printf ("%x\n", &pa);
}

file: 4.c
int
main ()
{
        extern int pa[];
        printf ("%p\n", pa);
        printf ("%d\n", pa[0]);
        f ();
               
        return 0;
}



0x403010
0
403010

在這個(gè)例子中, pa 被定義為一個(gè)指針,并初始化為0, 但在另一個(gè)模塊中,被聲明為一個(gè)數(shù)組.
編譯器在處理 printf ("%p\n", pa) 時(shí),認(rèn)為 pa 是數(shù)組,所以直接打印符號(hào)pa的值,此值為指針pa的地址!

編譯器在處理 printf ("%p\n", pa[0]) 時(shí),認(rèn)為 pa 是數(shù)組,以符號(hào) pa 對(duì)應(yīng)的值加一個(gè)偏移0,并取其值,得到的實(shí)際上是 指針  pa 的值 即 0.

三、總結(jié)

我羅羅嗦嗦地講了半天,如果還不清楚,請(qǐng)研究一下我給出的代碼。


[參考文獻(xiàn)]
[1] Peter Van Der Linden, <<Expert C Programming --- Deep C Secrets>;>;

posted on 2009-03-29 19:17 攀升 閱讀(2081) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区在线视频播放| 亚洲欧美国产精品桃花| 日韩一区二区精品在线观看| 一区二区三区在线免费视频| 极品少妇一区二区| 国产在线不卡| 在线成人黄色| 亚洲高清免费视频| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩亚洲视频| 99国产精品国产精品毛片| 亚洲最快最全在线视频| 亚洲欧美日韩国产另类专区| 久久爱91午夜羞羞| 欧美大片免费观看| 欧美午夜不卡视频| 黑丝一区二区三区| 99视频精品在线| 久久成人18免费网站| 免费黄网站欧美| 亚洲韩国青草视频| 亚洲精品综合精品自拍| 亚洲免费网址| 欧美不卡在线| 久久亚洲精品一区| 亚洲淫性视频| 免费影视亚洲| 亚洲视频免费| 毛片基地黄久久久久久天堂| 国产精品igao视频网网址不卡日韩| 国产毛片一区二区| 亚洲美女免费精品视频在线观看| 午夜国产精品视频| 亚洲第一页中文字幕| 亚洲一区二区影院| 欧美成人免费一级人片100| 国产欧美日韩高清| 正在播放亚洲一区| 欧美激情黄色片| 欧美一级片久久久久久久| 欧美日韩一区二区三区在线看| 国内精品视频一区| 亚洲欧美中文日韩在线| 欧美成人午夜77777| 亚洲一区www| 欧美成人精品福利| 激情国产一区| 久久精品国产v日韩v亚洲| 亚洲免费av电影| 农村妇女精品| 在线精品视频在线观看高清| 亚久久调教视频| 亚洲天堂av电影| 欧美日韩在线观看一区二区三区 | 精品1区2区| 午夜在线一区二区| 亚洲精品极品| 欧美国产三级| 亚洲人体1000| 亚洲第一精品电影| 免费短视频成人日韩| 国产中文一区二区三区| 欧美一区二区免费观在线| 一卡二卡3卡四卡高清精品视频| 久久综合中文字幕| 亚洲第一精品夜夜躁人人爽| 久久久国产精彩视频美女艺术照福利| 亚洲视频免费看| 国产精品久久国产愉拍| 亚洲婷婷综合色高清在线| 亚洲三级视频| 欧美视频一区在线| 亚洲主播在线观看| 亚洲欧美日韩国产中文在线| 国产精品一区二区黑丝| 欧美一级理论性理论a| 欧美一区二区三区在线| 狠狠入ady亚洲精品| 欧美国产精品久久| 欧美护士18xxxxhd| 99精品视频一区二区三区| 亚洲精品视频一区二区三区| 亚洲私拍自拍| 午夜精品免费视频| 国产一区日韩一区| 嫩草国产精品入口| 欧美精品18+| 亚洲天堂成人在线观看| 亚洲天堂网在线观看| 国产三级欧美三级日产三级99| 久久免费的精品国产v∧| 免费精品视频| 亚洲欧美激情精品一区二区| 小嫩嫩精品导航| 亚洲激情视频网| 亚洲人成7777| 国产性猛交xxxx免费看久久| 免费短视频成人日韩| 欧美另类在线观看| 久久久久国产精品一区| 浪潮色综合久久天堂| 亚洲一区精品视频| 久久精品毛片| 亚洲欧洲综合另类| 亚洲网在线观看| 在线欧美小视频| 免费久久精品视频| 久久综合久久久久88| 亚洲欧洲三级电影| 亚洲精品乱码久久久久久久久| 国产精品视频一二三| 欧美高清视频| 国产一区二区三区久久悠悠色av| 欧美激情视频在线免费观看 欧美视频免费一 | 久久精品导航| 欧美精品黄色| 久久午夜羞羞影院免费观看| 欧美精品一区二区三区很污很色的| 亚洲欧美三级在线| 欧美激情按摩在线| 久久在线免费观看| 国产精品久久久久久亚洲调教| 久久综合九色综合欧美狠狠| 欧美视频免费看| 亚洲第一色在线| 极品少妇一区二区| 午夜视频一区在线观看| 亚洲校园激情| 欧美激情精品久久久久久黑人| 久久综合狠狠| 国产精品系列在线| 一区二区高清在线| 日韩视频一区二区在线观看| 久久久欧美一区二区| 久久久久高清| 国产一区二区三区在线观看免费视频 | 欧美日韩精品一区二区三区| 麻豆精品视频在线观看视频| 国产精品区一区二区三区| 亚洲精品日韩综合观看成人91| 在线看无码的免费网站| 久久福利资源站| 久久久久国色av免费观看性色| 国产美女一区二区| 亚洲综合日本| 久久国产精品久久久久久电车| 国产精品久久久久久久app| 99精品视频网| 午夜精品久久久久久久| 国产精品久久久久久久午夜片| 亚洲色图自拍| 性色av一区二区三区| 国产日韩精品在线| 午夜精品区一区二区三| 久久久久看片| 亚洲高清一区二| 欧美精品亚洲二区| 99精品欧美一区二区蜜桃免费| 亚洲一区精彩视频| 国产欧美在线观看一区| 久久久精品久久久久| 欧美黄色一区二区| 一级成人国产| 国产精品视频xxxx| 久久电影一区| 亚洲精品综合久久中文字幕| 亚洲欧美视频在线观看| 国产欧美日韩在线观看| 久久九九热re6这里有精品| 亚洲国产欧美在线人成| 中文在线不卡| 激情懂色av一区av二区av| 免费观看30秒视频久久| 在线综合视频| 麻豆精品一区二区av白丝在线| 亚洲精品国精品久久99热一| 欧美午夜久久久| 久久久久九九视频| 亚洲精品在线视频观看| 欧美一区2区视频在线观看| 在线成人免费观看| 欧美视频一区在线观看| 久久久久综合| 亚洲图片自拍偷拍| 欧美国产在线电影| 亚洲婷婷在线| 亚洲视频在线观看三级| 麻豆精品精华液| 午夜精品在线看| 最新国产の精品合集bt伙计| 国产精品久久久一本精品| 久久视频在线免费观看| 在线亚洲免费视频| 欧美成人亚洲成人| 久久九九精品| 亚洲一二三区视频在线观看| 亚洲国产高清aⅴ视频| 国产麻豆综合| 欧美午夜片在线观看| 久久影院午夜论|