|
1. 數(shù)組并非指針
注意以下聲明的區(qū)別:
錯(cuò)誤示例:
文件2:
2. 指針和數(shù)組是如何訪問(wèn)的
首先要區(qū)分“地址y” 和“地址y的內(nèi)容”之間的區(qū)別,如 x = y; 注:C語(yǔ)言引入了“可修改的左值”這個(gè)術(shù)語(yǔ)。它表示左值允許出現(xiàn)這賦值語(yǔ)句的左邊。這個(gè)奇怪的術(shù)語(yǔ)是為了和數(shù)組名區(qū)分,駐足名也用于確定對(duì)象在內(nèi)存中的位置,也是左值,但它不能作為賦值的對(duì)象。因此,數(shù)組名是個(gè)左值但不是可修改的左值。 標(biāo)準(zhǔn)規(guī)定賦值符必須用可修改的左值作為它左邊一側(cè)的操作數(shù)。用通俗的話講:只能給可以修改的東西賦值。
編譯器為每個(gè)變量分配一個(gè)地址(左值),這個(gè)地址在編譯時(shí)可知,而且該變量在運(yùn)行時(shí)一直保存于這個(gè)地址。相反,存儲(chǔ)于變量中的值(它的右值)只有在運(yùn)行時(shí)才可知。如果需要用到變量中存儲(chǔ)的值,編譯器就發(fā)出指令從指定地址讀入變量值并將它存于寄存器中。
上圖同時(shí)也說(shuō)明為什么extern char a[]與extern char a[100]等價(jià)。這兩個(gè)聲明都指明 a 是一個(gè)數(shù)組,也就是一個(gè)內(nèi)存地址。編譯器并不知道數(shù)組有多長(zhǎng),因?yàn)樗划a(chǎn)生偏離其實(shí)地址的偏移地址。從數(shù)組提取一個(gè)字符,只要簡(jiǎn)單地從符號(hào)表顯示的 a 的地址加上下標(biāo),需要的字符就位于這個(gè)地址中。
3. 當(dāng)你“定義為指針,但以數(shù)組方式引用”時(shí)會(huì)發(fā)生什么 當(dāng)一個(gè)外部數(shù)組的實(shí)際定義是一個(gè)指針,但卻以數(shù)組方式引用時(shí),會(huì)引起什么問(wèn)題。(本來(lái)針對(duì)數(shù)組)需要對(duì)內(nèi)存進(jìn)行直接的引用(如第一個(gè)圖所示),但是這時(shí)編譯器所執(zhí)行的確是對(duì)內(nèi)存進(jìn)行間接引用(如上圖)。之所以會(huì)這樣,是因?yàn)槲覀兏嬖V編譯器我們擁有的是一個(gè)指針,如下圖所示。
4. 數(shù)組和指針的其他區(qū)別
數(shù)組和指針都可以在他們的定義中用字符串常量進(jìn)行初始化。盡管看上去一樣,底層的機(jī)制卻不相同。 注:在ANSI C中,初始化指針?biāo)鶆?chuàng)建的字符串常量被定義為只讀。如果試圖通過(guò)指針修改這個(gè)字符串常量,程序會(huì)出現(xiàn)未定義的行為。
與指針相反,由字符串常量初始化的數(shù)組是可以修改的。其中的單個(gè)字符在以后可以改變,比如下面語(yǔ)句: |
|
|
來(lái)自: lchjczw > 《基礎(chǔ)知識(shí)》