1. 程式人生 > >關於C中數組和指針的一點理解

關於C中數組和指針的一點理解

mage ext 獲得 字符串常量 一中 http 內存 spa color

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