關於C中數組和指針的一點理解
今天在看了專家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中數組和指針的一點理解