數組名和指針的定論

 我在這裏只想寫下結論,因爲過程不小心被我刪了,再寫下來很費精力。

 

char a[] = "520";    //      ----1

char *a = "520";    //      ----2

 

把它們當作兩個完全不同的東西——容易讓你接受下面的真理:

1、1中地址空間內儲存的實際值是"520",地址本身是a; 2中地址空間內儲存的實際值是一個地址,地址本身是&a。

2、對於數組a的任何引用,都相當於引用它本身的地址——對於指針a的任何引用,都相當於引用它儲存的實際值。

3、對於數組a,使用"&"(取地址)操作符,返回值同2,但意義不同(見5);對於指針a,則返回它本身的地址。

4、這是對於3的補充:數組名——a,是一個常量,不允許做任何修改。但是不同於其他常量,C語言在這裏並不替換它,而是把默認當成一個指針來使用。

5、有了4作基礎,因此也可以在數組名上做任何指針可以做的操作——多好啊!但是在數組名上做"&"操作有何意義呢?答案是有顯著意義的。對於像char a[5];這樣的句子,在任何時候引用a,a都會被解釋成char*。因此我們再使用a+1,或者a-1,都會按照char*的操作來解釋——前進4位或後退4位。然而如果我們用&a,雖然地址一樣,但是編譯器在看到這個語句的時候就會把&a解釋成char (*)[5];我們再在&a上做+或-的運算,就會按照char (*)[5]的行爲來進行響應的操作——前進後退5位。

 

 

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