今天看《狂人c》關於指標這一章,感覺自己c語言對於指標的理解確實更進一步了,作者**命名和格式雖然不怎麼樣,但是確實理解透徹,講得通俗,對於我這樣的入門級選手還是不錯的。
首先關於指標的幾個結論的理解:
指標儲存大小與作業系統位數有關,一般裝的是32位的作業系統,那麼指標輸出來顯示的便是32位,合4位元組,64位邊是8位元組,特別注意的是這個儲存空間與存放資料的大小不是乙個概念,這點直到今晚前,我都還有點犯迷糊,,文字不直觀,下面貼圖說明:
圖 1輸出整型變數str的位址和其後面兩個連續的位址,會發現0xbff4017c和0xbff40180相差了四個位元組,這四個位元組是什麼呢?之前一直以為是指標儲存空間需要四個位元組,但其實不是的,這四個位元組是因為int整型變數儲存需要四個位元組,所以才有了這樣的差距,下面用字元型變數char貼圖證明一下:
圖2會發現這裡的指標之間只相差1個位元組,原因就在於char型字元變數只需要乙個位元組來存放,所以這個差距**與指標變數的資料型別大小,而不是指標本身的大小。個人猜想指標大小是不需要我們關心的,這個的分配應該是作業系統做的事情,編譯器只是通過指標來定址找資料。
今晚還看到乙個比較震驚的運算就是,《狂人c》裡面抽象出這樣乙個等價式:
表示式1[表示式2]與(* ( (表示式1) + (表示式2) ) )完全等價,又因為加號「+」符合交換律,進一步推出(* ( (表示式1) + (表示式2) ) )等價於(* ( (表示式2) + (表示式1) ) ),然後推出等價於表示式2[表示式1]。繞暈了的同學可以直接看下面的例子:
也就是說在圖2中的字元陣列a,a[1] = 8,沒問題,那根據上面的理論,1[a] = 8,這個結論刺瞎我的眼睛了,當然也等價於*(a + 1),我的理解,也就是說是一種運算,他會把括號外陣列的位址和括號內的偏移相加然後算出位址,找到這個位址的資料取出來就完成了。
那麼對於a[1],是把陣列的起始位址a拿到手和偏移1相加得出位址,並獲取到a[1]的資料;
對於1[a],則是把陣列的起始位址1拿到,和偏移a相加得出位址,最後得出結果,這裡的偏移只是我個人助於理解的詞,不必糾結;
其實a[1]和1[a]的運算應該最後都被編譯器解釋為*(a+1)或者*(1+a),得出的結果是一樣的,那麼你直接執行**輸出*(a+1)和a[1]也就是一樣的效果了,只不過*(a+1)是編譯器分析處理後得出的結果*(a+1)而已,到這裡我可以得出乙個驚人的結論指標比陣列要快[1],這樣也就不難理解了,因為資料要通過編譯器把陣列的a[1]運算變成指標運算*(a+1),這一步是需要花時間的,而指標直接省了這一步,運算速度自然快,這個只是個人對於指標快於陣列的理解,有什麼理解誤區的地方還望各讀者指出一起進步。
參考文獻
[1]. h.m.deitel、p.j.deitel.c程式設計教程[m].北京:機械工業出版社.2007:218.
C語言指標和陣列理解
今天看 狂人c 關於指標這一章,感覺自己c語言對於指標的理解確實更進一步了,作者 命名和格式雖然不怎麼樣,但是確實理解透徹,講得通俗,對於我這樣的入門級選手還是不錯的。首先關於指標的幾個結論的理解 指標儲存大小與作業系統位數有關,一般裝的是32位的作業系統,那麼指標輸出來顯示的便是32位,合4位元組...
C語言 理解指標和陣列
a a 0 陣列名是該陣列首元素的位址 include include define size 4 intmain system pause return0 執行結果 注 位址是十六進製制的,因此7d比7c大1,3d比3c大1。在我們的系統中,位址按位元組編址,short型別占用2位元組,doubl...
C語言 陣列指標和陣列指標的理解
陣列指標和指標陣列如何分辨呢看他後面的側重 例如 分解 int a 3 int 3 a 指標陣列 int b 3 int 3 b 陣列指標 片段 這段 定義了乙個陣列指標和乙個陣列指標,利用指標的偏移來做測試 include int b 3 陣列指標 char str1 good char str2...