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

天下

記錄修行的印記

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

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


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


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


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


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


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


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


當編譯器到達代碼生成的各階段時,每次遇到數(shù)組名這個標識符,編譯器都會從符號表中取出這個數(shù)組的首地址,然后用這個地址來替代數(shù)組名,例如,假設數(shù)組a起始地址是0x8048000,則a[1]就會被編譯器轉化成*(0x8048000+1),
因此在生成的匯編代碼中,數(shù)組名已經(jīng)完全被轉化成一個常量,一個固定的數(shù)(地址)。
但是
對于指針p,它是一個變量,其值存儲在地址&p中,這個值在編譯時是不能得到的。
因為是變量,所以指針可以作為表達式中的左值操作,
如++或--,而被認為是常量的數(shù)組名卻不可以,正如你可以騎走一輛自行車,但是不能騎走一棵樹。


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


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


a被認為是常數(shù),所以取*(a+1)的值只需將a所表示的常數(shù)加1,然后從得到的地址里訪存取一次即可。
對于指針,需要先從&p這個地址里把p的值取出來,然后加1,再從得到的地址里訪存取一次,一共需要兩次訪存。


第四,假設a是一個數(shù)組名,而p是一個指針,當你使用 a 和 &a 時,得到值是一樣的,都是數(shù)組的起始地址。
而使用 p 和 &p 時,得到的值是不一樣的, p 表示指針 p 所指向的地址,而 &p 表示 p 這個變量的地址。
再假設   p = a;
則 p 就表示數(shù)組a的起始地址,而&p是存儲數(shù)組a的起始地址的那個地址。
這是因為編譯器把a當成數(shù)組首地址,而&a當作數(shù)組第一個元素的地址,因此得到的值是一樣的。
另外,sizeof(a)得到的是a所表示的數(shù)組的大小,而sizeof(p)得到的是指針的大小。

轉自:
http://blog.chinaunix.net/uid-27004869-id-3301282.html

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

<2012年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

導航

統(tǒng)計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            毛片精品免费在线观看| 亚洲国产日韩一级| 亚洲欧美一区二区三区久久| 国产精品成人va在线观看| 亚洲香蕉网站| 亚洲一区二区三区乱码aⅴ| 国产精品视频精品| 欧美亚洲视频在线观看| 欧美一区二区三区在线看| 国产一区美女| 欧美激情免费观看| 欧美人与性动交a欧美精品| 洋洋av久久久久久久一区| 在线视频欧美一区| 国产亚洲精品自拍| 欧美大秀在线观看| 欧美日韩成人一区| 性做久久久久久免费观看欧美| 亚洲欧美日韩一区在线| 在线观看日韩www视频免费 | 亚洲午夜小视频| 亚洲天堂偷拍| 亚洲第一页在线| 99视频精品全部免费在线| 国产亚洲激情视频在线| 欧美大片在线观看一区| 国产精品老女人精品视频| 久久亚洲精品伦理| 欧美日韩中字| 欧美成人午夜免费视在线看片| 欧美日韩在线视频一区二区| 另类激情亚洲| 欧美亚一区二区| 欧美大片一区| 国产一区二区三区在线观看网站 | 亚洲午夜激情| 亚洲国产三级| 亚洲女人天堂成人av在线| 在线观看视频日韩| 亚洲一区bb| 亚洲精品乱码久久久久久日本蜜臀| 99国产一区| 亚洲欧洲日产国产综合网| 午夜在线观看免费一区| 亚洲精选91| 久久亚洲风情| 久久精品国产精品亚洲综合| 欧美日韩一区在线观看| 亚洲第一福利社区| 国产亚洲激情视频在线| 一区二区免费在线视频| 亚洲美女在线观看| 久久资源在线| 麻豆视频一区二区| 国产亚洲精品久| 亚洲一区二区三区四区五区午夜 | 香蕉亚洲视频| 欧美日韩hd| 亚洲欧洲三级电影| 亚洲欧洲精品一区二区| 久久久精品2019中文字幕神马| 性感少妇一区| 国产精品午夜在线观看| 亚洲天堂成人| 亚洲午夜视频在线观看| 欧美日韩免费观看一区| 亚洲欧洲一区二区天堂久久 | 极品尤物av久久免费看| 亚洲综合大片69999| 午夜久久资源| 国产精品麻豆va在线播放| av成人天堂| 香蕉久久夜色精品国产使用方法| 国产精品久久久久久久浪潮网站| 日韩一级免费| 亚洲综合视频一区| 国产精品视频免费一区| 午夜精品美女久久久久av福利| 午夜视频在线观看一区二区| 国产日韩欧美不卡| 欧美在线网站| 欧美国产日韩xxxxx| 亚洲精品麻豆| 国产精品高潮呻吟久久av黑人| 一本色道久久88综合亚洲精品ⅰ| 一本大道久久a久久精品综合| 欧美日本免费一区二区三区| 一区二区免费在线视频| 久久精品综合| 亚洲美女黄色片| 国产精品久久久久久亚洲毛片 | 一本色道久久综合亚洲精品小说 | 亚洲午夜精品久久| 国产美女一区二区| 久久一区二区视频| 日韩亚洲一区在线播放| 久久精品国产清自在天天线| 亚洲大胆美女视频| 欧美午夜视频网站| 久久精品卡一| 日韩午夜三级在线| 久久久成人网| 洋洋av久久久久久久一区| 国产精品欧美一区喷水| 久久综合999| 亚洲天堂黄色| 亚洲电影在线看| 欧美亚洲在线观看| 亚洲精品久久久久中文字幕欢迎你| 国产精品久久二区| 美女亚洲精品| 欧美伊人久久| 亚洲天堂成人在线观看| 亚洲国产精品视频| 久久精品理论片| 亚洲神马久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美色精品天天在线观看视频| 午夜精品影院| 在线午夜精品自拍| 亚洲国产美女精品久久久久∴| 欧美一区激情视频在线观看| 日韩视频在线观看| 伊人久久av导航| 国产性猛交xxxx免费看久久| 欧美日韩激情小视频| 欧美成人69av| 久久久一区二区三区| 欧美一进一出视频| 亚洲午夜成aⅴ人片| 日韩一级成人av| 亚洲人午夜精品免费| 欧美国产亚洲视频| 老司机一区二区三区| 久久久久网址| 久久久久欧美| 久久久亚洲人| 久久久综合网站| 久久电影一区| 欧美亚洲日本国产| 欧美一区视频| 欧美在线短视频| 欧美在线视频不卡| 性欧美xxxx大乳国产app| 亚洲欧美福利一区二区| 亚洲视频精品| 亚洲欧美国产精品桃花| 亚洲午夜成aⅴ人片| 亚洲影音先锋| 欧美亚洲免费电影| 久久精品人人做人人综合| 久久久久久久综合狠狠综合| 欧美在线看片a免费观看| 欧美在线一级va免费观看| 久久er精品视频| 久久综合色播五月| 女人色偷偷aa久久天堂| 91久久精品国产91久久性色tv| 最新日韩在线视频| 99精品99久久久久久宅男| 亚洲视频专区在线| 午夜一区二区三区在线观看| 久久久久久69| 欧美精品色综合| 国产精品美女久久久久aⅴ国产馆| 欧美午夜精品电影| 国产专区欧美精品| 亚洲国产精品一区二区www在线| 亚洲精品日日夜夜| 亚洲免费综合| 蜜臀久久99精品久久久画质超高清 | 久久精品国产亚洲精品| 你懂的国产精品| 日韩西西人体444www| 亚洲欧美清纯在线制服| 久久99在线观看| 欧美日韩 国产精品| 国产欧美亚洲日本| 亚洲三级免费| 小处雏高清一区二区三区| 欧美xx69| 亚洲一区二区欧美日韩| 久久亚洲欧美国产精品乐播| 欧美日韩一区不卡| 韩国免费一区| 亚洲视频在线观看网站| 久久综合网色—综合色88| 亚洲精品一区二区三区婷婷月 | 你懂的亚洲视频| 在线视频一区观看| 免费观看不卡av| 国产亚洲精品v| 亚洲一区免费在线观看| 欧美电影在线| 亚洲一区二区3| 欧美激情一区二区三区在线视频观看 | 亚洲免费综合| 亚洲精品综合精品自拍| 久久精品夜色噜噜亚洲a∨| 国产精品电影网站|