標籤:int image bubuko 編譯 大小 col 關於 一點 style
今天在看了專家c的第四章後對數組和指標有了更深入的理解
首先
1 /*檔案1*/2 int p[100];3 4 /*檔案2*/5 extern int *p;6 7 /*.........................*/8 9 /*.............對p[i]相關的操作.................*/
為什麼會這樣呢?指標和數組難道不就是一個玩意嗎? 然而並不是.
先列出指標和數組的重要區別
------------------------------------------------------------------------------------
| 指標 | 數組 |
------------------------------------------------------------------------------------
| 儲存的是資料的地址 | 儲存資料本身 |
------------------------------------------------------------------------------------
| 間接訪問資料,首先在 | 首先在符號表中找到數組 |
| 符號表中找到該指 | 的地址,然後從該位置開始 |
| 針的地址,取出記憶體中的 | 後面連續的位置全為資料 |
| 值,然後訪問該值所指 | |
| 的地址從而達到資料 | |
---------------------------------------------------------------------------------------
根據以上區別,推導一下平時用指標來訪問數組的過程
(1) 當我們有
char *p="12345";c=*p;
通過如下過程獲得資料
1.編譯器在符號表取得p的地址
2.然後取得p中的內容
3.以p中內容為地址得到資料
(2)當我們有
char p[]="12345";c=p[3];
通過如下過程獲得資料
1.編譯器在符號表中取得p的地址
2.從p開始的連續多個位元組中就是存的資料,這裡是3就是從p開始跳三步,每步大小為一位元組
(3)當我們有
char *p="12345";c=p[3];
通過如下過程獲得資料
1.編譯器在符合表中獲得p的地址(這個字串常量會分配記憶體且被定義為唯讀)
2.從p的地址中讀出內容,即指標
3.將內容與位移量相加這裡是3
4.以3為地址取出該位置的值
再來思考一下開始的那個錯誤
1 /*檔案1*/2 int p[100];3 4 /*檔案2*/5 extern int *p;6 7 /*.........................*/8 9 /*.............對p[i]相關的操作.................*/
在檔案二中我們聲明了p為一個指標,編譯器會把它當做指標來解釋(無論p之前是定義為數組還是指標)從而也就是我們上面的情況(3)
將執行
1.在符號表中找到p的地址
2.取出p中的內容作為地址
3.將............等一等.........
我們發現在檔案一中,p定義為數組
也就是說按照這種機制,p的第一個資料將被編譯器解釋成一個地址,一個int型的數當成了一個地址....................................所以錯誤可想而知.......
關於C中數組和指標的一點理解