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

天下

記錄修行的印記

從編譯器角度分析C語(yǔ)言中數(shù)組名和指針的區(qū)別

從編譯器角度分析C語(yǔ)言中數(shù)組名和指針的區(qū)別


數(shù)組名和指針是兩個(gè)往往很容易讓人們混淆的概念,
很多人以為數(shù)組名就是一個(gè)指針,
也有很多人知道數(shù)組名不同于指針但是僅知道數(shù)組名的值不能像指針一樣改變


例如你可以寫出下面這樣的代碼:
int *p;
p++;
卻不能寫這樣的代碼:
int a[];
a++;


那么數(shù)組名跟指針之間到底有什么區(qū)別呢?
第一,在聲明上,只有作為函數(shù)參數(shù)的數(shù)組名編譯器總是轉(zhuǎn)化成指針,
其他情況下,數(shù)組名就是數(shù)組名,指針就是指針,二者不能混淆,
你不能在一個(gè)文件中定義一個(gè)數(shù)組,而在另一個(gè)文件中把它聲明成一個(gè)指針。
char a[];    //定義一個(gè)數(shù)組a
extern char* a;    //在另一個(gè)文件中將a聲明成一個(gè)指針


在編譯器中,符號(hào)表用來(lái)存放C語(yǔ)言中有關(guān)標(biāo)識(shí)符的屬性信息,這些信息集中反應(yīng)了標(biāo)識(shí)符的特征屬性。
等到詞法分析到代碼聲稱的各個(gè)階段的時(shí)候,編譯器需要根據(jù)源代碼提出的要求,從表中獲取不同標(biāo)識(shí)符的不同屬性。
值得注意的是,數(shù)組標(biāo)識(shí)符的屬性和指針是完全不同的。
因此,在一個(gè)文件中定義一個(gè)數(shù)組的時(shí)候,編譯器會(huì)把它記錄在符號(hào)表中,而在編譯器分析另一個(gè)文件中的聲明時(shí),通過(guò)符號(hào)的語(yǔ)義檢查發(fā)現(xiàn)不一致。
也許這樣的聲明可以編譯通過(guò)(在gcc下通過(guò)了),但是把一個(gè)數(shù)組名當(dāng)成一個(gè)指針來(lái)使用,別指望它能運(yùn)行起來(lái)。


第二,指針是一個(gè)變量,而數(shù)組名不是。
數(shù)組名是數(shù)組的首地址,它本身就是一個(gè)地址,對(duì)應(yīng)到匯編語(yǔ)言級(jí)別就是一個(gè)常量,一個(gè)固定的數(shù)(地址)。
因此數(shù)組名不能進(jìn)行++,--等運(yùn)算。
在大多數(shù)編譯器中,對(duì)數(shù)組的引用a[i]總是被編譯器改寫成*(a+i)的格式。
也就是說(shuō),編譯器每遇到a[i],都會(huì)把它當(dāng)作*(a+i)來(lái)處理。
我們都知道,*addr表示內(nèi)存中(addr)的位置存儲(chǔ)的值,
比如*0x8048000就表示地址為0x8048000的內(nèi)存中所存儲(chǔ)的值。
所以a[i]就表示a的值加上i所得到的數(shù)作為一個(gè)內(nèi)存地址里面所存儲(chǔ)的值。


那么a的值是什么呢 ???
編譯器在做詞法分析和語(yǔ)法分析的時(shí)候,遇到一個(gè)數(shù)組的定義,就會(huì)把數(shù)組的有關(guān)信息匯集在一個(gè)叫做“內(nèi)情向量”或“信息向量”的表格中,其中的信息包括數(shù)組的類型,維數(shù),各維的上、下邊界,以及數(shù)組的首地址,然后將這個(gè)“內(nèi)情向量”相關(guān)信息存儲(chǔ)在符號(hào)表中。
數(shù)組定義后位置就是固定的,因此其首地址可以在編譯階段得到。


當(dāng)編譯器到達(dá)代碼生成的各階段時(shí),每次遇到數(shù)組名這個(gè)標(biāo)識(shí)符,編譯器都會(huì)從符號(hào)表中取出這個(gè)數(shù)組的首地址,然后用這個(gè)地址來(lái)替代數(shù)組名,例如,假設(shè)數(shù)組a起始地址是0x8048000,則a[1]就會(huì)被編譯器轉(zhuǎn)化成*(0x8048000+1),
因此在生成的匯編代碼中,數(shù)組名已經(jīng)完全被轉(zhuǎn)化成一個(gè)常量,一個(gè)固定的數(shù)(地址)。
但是
對(duì)于指針p,它是一個(gè)變量,其值存儲(chǔ)在地址&p中,這個(gè)值在編譯時(shí)是不能得到的。
因?yàn)槭亲兞浚灾羔樋梢宰鳛楸磉_(dá)式中的左值操作,
如++或--,而被認(rèn)為是常量的數(shù)組名卻不可以,正如你可以騎走一輛自行車,但是不能騎走一棵樹(shù)。


另外,C語(yǔ)言把 數(shù)組下標(biāo) 改寫成 指針偏移量 的  根本原因  是
指針偏移量是底層硬件所使用的基本模型。


第三,對(duì)數(shù)組的引用,如a[i],或*(a+1),需要訪存一次;而對(duì)指針的引用,如*(p+1),需要訪存兩次。


a被認(rèn)為是常數(shù),所以取*(a+1)的值只需將a所表示的常數(shù)加1,然后從得到的地址里訪存取一次即可。
對(duì)于指針,需要先從&p這個(gè)地址里把p的值取出來(lái),然后加1,再?gòu)牡玫降牡刂防镌L存取一次,一共需要兩次訪存。


第四,假設(shè)a是一個(gè)數(shù)組名,而p是一個(gè)指針,當(dāng)你使用 a 和 &a 時(shí),得到值是一樣的,都是數(shù)組的起始地址。
而使用 p 和 &p 時(shí),得到的值是不一樣的, p 表示指針 p 所指向的地址,而 &p 表示 p 這個(gè)變量的地址。
再假設(shè)   p = a;
則 p 就表示數(shù)組a的起始地址,而&p是存儲(chǔ)數(shù)組a的起始地址的那個(gè)地址。
這是因?yàn)榫幾g器把a(bǔ)當(dāng)成數(shù)組首地址,而&a當(dāng)作數(shù)組第一個(gè)元素的地址,因此得到的值是一樣的。
另外,sizeof(a)得到的是a所表示的數(shù)組的大小,而sizeof(p)得到的是指針的大小。

轉(zhuǎn)自:
http://blog.chinaunix.net/uid-27004869-id-3301282.html

posted on 2012-08-07 09:00 天下 閱讀(422) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++

<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲激情中文1区| 亚洲一区在线播放| 亚洲精品一区在线| 亚洲欧洲一区二区在线观看| 久久久91精品国产| 久久欧美肥婆一二区| 亚洲第一福利视频| 亚洲欧美在线看| 亚洲欧美日韩网| 欧美aⅴ99久久黑人专区| 亚洲一区二区精品视频| 亚洲视频免费看| 久久久噜噜噜久久中文字免| 亚洲一区二区在线视频| 一区二区三区视频观看| 夜夜精品视频一区二区| 在线视频精品一| 亚洲欧美成人一区二区三区| 在线亚洲激情| 亚洲欧美成人综合| 久久久亚洲影院你懂的| 欧美福利视频在线| 亚洲一区在线播放| 久久成人18免费观看| 麻豆成人91精品二区三区| 欧美成人激情视频| 国产精品男人爽免费视频1| 激情婷婷亚洲| 亚洲一区国产视频| 免费久久99精品国产自| 国产精品国产三级国产aⅴ浪潮 | 亚洲黄色免费| 欧美在线视频一区二区三区| 老司机精品视频网站| 99热在线精品观看| 欧美福利网址| 亚洲人成人一区二区在线观看| 亚洲一区二区三区视频| 久久综合99re88久久爱| 亚洲欧美国产毛片在线| 欧美午夜欧美| 日韩午夜电影av| 亚洲欧洲在线观看| 蜜桃精品一区二区三区 | 欧美在线一二三区| 欧美视频一区在线观看| 在线综合亚洲| 在线一区二区视频| 欧美午夜精品久久久久久孕妇| 亚洲人成人一区二区三区| 亚洲高清一区二区三区| 麻豆精品一区二区综合av| 亚洲国产91| 99热免费精品| 国产视频久久久久| 欧美.日韩.国产.一区.二区| 免费成人黄色片| 亚洲香蕉在线观看| 久久精品国产亚洲精品| 亚洲精品免费电影| 午夜日韩电影| 99人久久精品视频最新地址| 亚洲精选久久| 久久在线91| 午夜精品久久久久久99热| 久久精品盗摄| 午夜精品成人在线视频| 久久伊人免费视频| 亚洲欧美日韩区| 欧美日韩国产成人在线91| 久久综合图片| 国产日韩欧美亚洲一区| 亚洲免费播放| 亚洲剧情一区二区| 久久久久一区| 久久久亚洲人| 国产热re99久久6国产精品| 亚洲精品资源美女情侣酒店| 狠狠色2019综合网| 欧美一区视频| 巨乳诱惑日韩免费av| 国产中文一区| 久久一区二区三区四区五区| 校园春色综合网| 亚洲精品女av网站| 欧美日韩三级视频| 亚洲黄色毛片| 欧美激情一区二区三区| 亚洲最新色图| 欧美高清视频一二三区| 久久精品国产v日韩v亚洲 | 久久狠狠婷婷| 亚洲天堂第二页| 一区二区三区四区蜜桃| 亚洲精品无人区| 亚洲人屁股眼子交8| 久久精品国产96久久久香蕉| 午夜日韩视频| 欧美日韩国产小视频| 久久久精品一区| 久久久综合精品| 欧美一区二区三区精品| 午夜精品福利电影| 久久久久久久久综合| 玖玖玖国产精品| 欧美激情亚洲国产| 国产精品草草| 国产一区二区三区在线播放免费观看 | 国产亚洲欧美另类中文| 国产亚洲精品美女| 亚洲高清网站| 99热免费精品在线观看| 日韩亚洲欧美一区| 亚洲欧美一级二级三级| 久久久久国色av免费观看性色| 久久这里只有精品视频首页| 欧美大片专区| 久久成人精品一区二区三区| 蜜臀91精品一区二区三区| 欧美日韩在线精品| 精品91久久久久| 亚洲免费在线观看视频| 久久精品一区二区三区四区| 久久夜色精品亚洲噜噜国产mv| 免费在线观看日韩欧美| 日韩视频在线观看国产| 欧美在线不卡| 欧美激情第五页| 国产视频一区在线观看一区免费| 在线观看欧美| 亚洲欧美日韩在线| 亚洲激情偷拍| 欧美综合国产| 欧美精品久久99久久在免费线| 欧美三区美女| av成人免费观看| 久久久久一区| 一区二区三欧美| 久久综合九色九九| 日韩一级欧洲| 欧美日本国产在线| 日韩一级黄色大片| 欧美激情中文字幕乱码免费| 欧美成人激情视频免费观看| 欧美一区三区二区在线观看| 国产精品日韩| 久久国产99| 久久蜜臀精品av| 亚洲国产美国国产综合一区二区| 久久一区国产| 欧美成人精品1314www| 在线观看国产精品网站| 欧美大片网址| 欧美精选午夜久久久乱码6080| 91久久久久久| 夜夜嗨av一区二区三区四季av| 欧美老女人xx| 翔田千里一区二区| 久久大综合网| 日韩视频精品| 欧美与欧洲交xxxx免费观看| 亚洲第一区中文99精品| 亚洲美女电影在线| 国产欧美日韩一区二区三区在线| 欧美亚洲免费高清在线观看| 久久成人亚洲| 99re6热在线精品视频播放速度| 日韩亚洲国产欧美| 国产自产2019最新不卡| 亚洲精品影视| 99国产精品| 欧美顶级大胆免费视频| 欧美电影美腿模特1979在线看| 国模私拍视频一区| 久久人人爽人人爽| 亚洲欧洲一区二区三区在线观看 | 好吊成人免视频| 最新国产の精品合集bt伙计| 国产一区二区0| 亚洲欧洲av一区二区| 亚洲午夜免费视频| 欧美日韩高清不卡| 国产亚洲欧美激情| 久久国产精品一区二区| 欧美mv日韩mv国产网站| 国产精品一区二区女厕厕| 欧美国产日本韩| 最新国产拍偷乱拍精品| 欧美刺激午夜性久久久久久久| 欧美专区日韩专区| 国产精品一区二区久久久| 99在线|亚洲一区二区| 在线亚洲精品| 国产毛片久久| 欧美一区二区视频网站| 久久精品国产一区二区三区免费看| 狂野欧美一区| 久久久国产一区二区三区| 久久亚裔精品欧美| 999亚洲国产精|