C語言指針和數組理解

    今天看《狂人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),這一步是需要花時間的,而指針直接省了這一步,運算速度自然快,這個只是個人對於指針快於數組的理解,有什麼理解誤區的地方還望各讀者指出一起進步。


附《狂人C》指針章節地址,有興趣的朋友可以好好研究下:http://www.cnblogs.com/KBTiller/archive/2010/12/23/1914542.html


參考文獻

[1].  H.M.Deitel、P.J.Deitel.C程序設計教程[M].北京:機械工業出版社.2007:218.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章