2 回答

TA貢獻(xiàn)1856條經(jīng)驗 獲得超5個贊
樓主是初學(xué)C語言嗎?如果是初學(xué)者能夠觸探到這樣的問題我認(rèn)為是大有前途的。
都說C語言最難理解的是指針,而指向指針的指針和二維數(shù)組又是最容易搞混的地方,因為二者都通過在前面加兩個*來取值。但二者是完全不同的類型,運算法則完全不一樣。
樓主做強(qiáng)制轉(zhuǎn)換雖然騙過了編譯器,但接下來執(zhí)行f里面代碼的時候,a[0][0]是按照*(*(a+0))的方式展開執(zhí)行的,注意a的類型是指向指針的指針而不是二維數(shù)組名,所以括號里面的*(a+0)的執(zhí)行結(jié)果就是1,接下來再執(zhí)行*1,這個時候把1當(dāng)作一個地址,試圖把這個地址里面的數(shù)據(jù)取出來,現(xiàn)在可以明白了,如果不報錯,取到的并非你預(yù)期的數(shù)據(jù),是一個不可預(yù)料的值。之所以報錯是因為運行環(huán)境檢測到1這個地址不是本程序有權(quán)訪問的(是操作系統(tǒng)的保留內(nèi)存),所以就報錯了,這里其實就形成了一個野指針。
而假如a的類型是二維數(shù)組名,a[0][0]也是按照*(*(a+0))的方式執(zhí)行的,但此時應(yīng)注意a是一個行指針,指向二維數(shù)據(jù)的第一行,a+0=a還是指向二維數(shù)據(jù)的第一行(a+1就表示指向第二行的行指針),*(a+0)只不過是把行指針轉(zhuǎn)成了列指針(注意a+0和*(a+0)的值是相同的,只不過類型不同,你可以打印出來看下),接下來再執(zhí)行最外層的*就是取第一行第一列的值了。
由此可見指向指針的指針和二維數(shù)組名取值的運算法則是完全不一樣的,請樓主仔細(xì)體會。
另外要補充說明的是,二維數(shù)組從物理上來說也是一段連續(xù)的內(nèi)存空間,而不應(yīng)把它想象成
裝著多個一維數(shù)組的數(shù)組。
- 2 回答
- 0 關(guān)注
- 787 瀏覽
添加回答
舉報