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

攀升·Uranus


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

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

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

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

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


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

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

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

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


一、理論分析

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

對于指針

int *p;

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

.comm p, 4

對于數(shù)組:

int a[10]

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

.comm a, 40

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

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

或者,更簡單的

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

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

int a[10];
a[0];

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

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

或更簡單的:

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

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

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

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

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

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

運行這個程序,Segmentation fault

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

第二個例子演示“把指針聲明為數(shù)組”如何的到錯誤的數(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

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

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

三、總結

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


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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美另类一区| 国产综合亚洲精品一区二| 亚洲精品久久久久久一区二区| 亚洲免费在线视频| 亚洲一区二区三区激情| 亚洲欧美日韩精品久久奇米色影视 | 欧美亚洲不卡| 国产精品无码专区在线观看| 国产欧美日韩一区二区三区| 狠狠入ady亚洲精品| 亚洲国产高清一区| 一本久道久久综合婷婷鲸鱼| 在线亚洲激情| 久久久国产亚洲精品| 久热精品视频在线观看一区| 亚洲国产婷婷| 午夜精品免费| 欧美插天视频在线播放| 国产精品超碰97尤物18| 狠狠做深爱婷婷久久综合一区| 亚洲片国产一区一级在线观看| 亚洲一区中文字幕在线观看| 久久亚洲综合网| 99精品视频免费观看视频| 久久国产精品黑丝| 欧美日韩欧美一区二区| 黄色小说综合网站| 亚洲自拍都市欧美小说| 美日韩精品视频免费看| 亚洲深夜影院| 欧美精品七区| 精品1区2区3区4区| 亚洲四色影视在线观看| 免费看成人av| 欧美一区视频| 国产精品视频福利| 一区二区三区国产精品| 欧美国产日韩精品| 久久久久久久久久久久久9999| 欧美日韩一区二区视频在线观看 | 国产精品入口日韩视频大尺度| 亚洲国产成人在线| 欧美精品系列| 激情视频一区| 久久久久久一区二区三区| 亚洲精品一区二| 蜜桃精品一区二区三区| 国内精品国产成人| 欧美亚洲日本网站| 亚洲网站在线| 国产精品麻豆va在线播放| 一区二区三区日韩欧美| 亚洲国产片色| 欧美精品www| 亚洲精品日韩精品| 亚洲国产精品欧美一二99| 浪潮色综合久久天堂| 激情一区二区| 免费高清在线视频一区·| 久久成人资源| 又紧又大又爽精品一区二区| 久久久噜噜噜久久人人看| 性久久久久久久久久久久| 国产私拍一区| 久久蜜桃av一区精品变态类天堂| 欧美一级片久久久久久久| 国产日韩欧美精品| 久久久久久亚洲精品不卡4k岛国| 欧美有码在线观看视频| 一区二区三区在线高清| 欧美成人精品在线播放| 猛干欧美女孩| 在线一区亚洲| 亚洲影院免费观看| 国模叶桐国产精品一区| 欧美不卡一区| 欧美韩日一区二区三区| 亚洲午夜一区| 欧美一区二区播放| 亚洲国产欧美在线| 亚洲久久成人| 国产日韩欧美精品综合| 欧美成人蜜桃| 国产精品v亚洲精品v日韩精品| 午夜精品理论片| 久久久久国产免费免费| 99视频一区二区| 亚洲午夜久久久| 国内外成人在线视频| 亚洲黄色av| 国产日韩欧美高清免费| 欧美激情亚洲自拍| 国产精品视频网| 欧美激情亚洲国产| 国产精品免费aⅴ片在线观看| 久久尤物视频| 欧美午夜精品| 欧美成人精品影院| 国产精品久久亚洲7777| 嫩草成人www欧美| 国产精品实拍| 亚洲黄一区二区| 国产一区二区主播在线| 亚洲精品小视频在线观看| 国产视频一区二区三区在线观看| 亚洲精品乱码久久久久| 香蕉av福利精品导航| 一本久道久久综合狠狠爱| 久久国产综合精品| 亚洲欧美成aⅴ人在线观看| 久久久久.com| 欧美一区二区三区视频在线观看| 免费久久99精品国产| 久久精品视频99| 国产精品免费小视频| 亚洲黄色性网站| 极品av少妇一区二区| 亚洲一区亚洲| 亚洲午夜女主播在线直播| 欧美成人四级电影| 久久午夜精品一区二区| 国产毛片一区| 亚洲视频免费在线| 中文国产亚洲喷潮| 欧美国产91| 亚洲丰满少妇videoshd| 在线成人国产| 欧美一区二区免费| 久久av资源网站| 国产欧美精品在线播放| av成人手机在线| 中文成人激情娱乐网| 欧美激情一区| 亚洲精品国产精品乱码不99按摩 | 亚洲影视在线| 欧美人成在线| 日韩视频在线观看| 99视频精品在线| 欧美美女福利视频| 亚洲日本免费| 亚洲天堂黄色| 国产精品亚洲网站| 欧美一级久久久| 美女主播视频一区| 亚洲激情网址| 欧美另类久久久品| 一本色道久久88精品综合| 午夜精品久久久久久久白皮肤| 国产精品美女久久久浪潮软件 | 亚洲国产成人av| 99视频超级精品| 国产精品久久久久毛片大屁完整版| 一本一本久久| 久久精品日产第一区二区| 亚洲成人在线观看视频| 欧美激情第二页| 中文有码久久| 久久午夜羞羞影院免费观看| 亚洲韩国青草视频| 欧美体内she精视频| 性做久久久久久久久| 欧美a级大片| 亚洲视频在线观看视频| 国产女同一区二区| 久久视频在线免费观看| 亚洲精品日韩综合观看成人91 | 亚洲精品偷拍| 性久久久久久久久久久久| 国内一区二区三区| 欧美日韩一区二区三区在线视频| 久久九九免费视频| 亚洲第一偷拍| 国产精品每日更新| 久久久久久国产精品mv| 亚洲人成啪啪网站| 久久精品一区二区三区四区 | 欧美大成色www永久网站婷| 中国成人黄色视屏| 欧美成人精品在线播放| 亚洲欧美卡通另类91av| 亚洲国产精品一区二区尤物区| 欧美日韩在线一区二区三区| 欧美制服丝袜| 中文在线一区| 亚洲国产精品久久久久婷婷884 | 免费成人av在线看| 亚洲一区二区免费看| 亚洲国产日韩在线| 久久午夜精品| 欧美影院一区| 亚洲一区二区三区高清| 亚洲片在线资源| 伊人婷婷欧美激情| 国产日韩精品久久| 欧美日韩一区二区视频在线观看 | 亚洲国产精品视频一区| 狼人社综合社区| 久久久www成人免费无遮挡大片| 一区二区国产日产| 亚洲人体1000|