先看乙個問題,輸出結果是什麼?
如果說你認為結果是
2 , 2
那你就天真了。
正確結果是 2 ,5
下面分析一下
*(a + 1) = 2這是毫無疑問的
那為什麼
*(p - 1) = 5 呢?
這是因為&(a + 1)與(a + 1)根本不是一回事
不是說好陣列名a與陣列名取位址&a和陣列首元素a[0]都是乙個位址嗎?
是的,在某種程度可以這麼理解
回想一下指標加一的操作,系統是怎麼知道我們的加一操作位址是加多少呢,int型別指標加一位址加4,而char型別指標加一位址卻加1,這說明系統儲存指標的時候很可能還有乙個儲存指標指向的型別的東西,這個東西可能就是表示被指向內容所佔的空間大小,暫且叫它「指標空間」吧。所以int型別「指標空間」就是4,而char型別「指標空間」是1。
可以理解成乙個結構體
struct
已知前面&(a)與(a)指向的位址一樣,那只有「指標空間」不一樣了。
&a表示取整個陣列的位址,所以「指標空間「是整個陣列的大小20,(&a + 1)實際上加一操作增加了sizeof(a) = 4 * 5 = 20個記憶體單元,此時(&a + 1)指向陣列的第六個元素a[5],很明顯是越界了。
再看上面第三行**int *p = (int )(&a + 1)
這裡強制轉換的時候」指標空間「由20變成4了,所以p實際上只是單純指向乙個元素,不難思考,最後printf列印的是(p - 1)實際就是a[4]。
所以上面程式執行結果是2 , 5
最後,下面**執行結果又是多少呢?
一維指標和二維指標指向二維陣列的一些問題
廢話少說,先上自己dev c 上的 include int main p,rp 3 q,i p int c rp c q c printf rp d n rp p n c p n p p n q p n q d n rp rp,c p,q q printf rp 1 p n p 1 p n rp 1...
二維陣列和指標的一些感悟
編譯器 vc 6.0 win32 platform program 陣列和指標 一 一維陣列和指標 int a 2 int p p a 首先 p 指向 a,因為陣列的名字就是指標,而且型別是 int 所以這裡簡單的匹配了。那麼 p a 0 0x12345678 p 1 a 1 90 注意指標位址加一...
陣列(一維陣列 二維陣列)
陣列概述 c 陣列從零開始建立索引,即陣列索引從零開始。c 中陣列的工作方式與在大多數其他流行語言中的工作方式類似。但還有一些差異應引起注意。這些其實和泛型有些類似,陣列的操作沒有泛型方便,但是效能卻不是泛型所能比擬的 宣告陣列時,方括號 必須跟在型別後面,而不是識別符號後面。在c 中,將方括號放在...