a a[0] &a &a[0]的理解

數組中幾個關鍵符號(a a[0] &a &a[0])的理解(前提是 int a[10])
(1)這4個符號搞清楚了,數組相關的不少問題都有答案了。理解這些符號的時候要和左值右值結合起來,也就是搞清楚每一個符號分別作左值和右值時的不一樣含義。
(2)a就是數組名。a作左值時表示整個數組的全部空間(10×4=40字節),又由於C語言規定數組操做時要獨立單個操做,不能總體操做數組,因此a不能作左值;a作右值表示數組首元素(數組的第0個元素,也就是a[0])的首地址(首地址就是起始地址,就是4個字節中最開始第一個字節的地址)。a作右值等同於&a[0];
(2)a[0]表示數組的首元素,也就是數組的第0個元素。作左值時表示數組第0個元素對應的內存空間(連續4字節);作右值時表示數組第0個元素的值(也就是數組第0個元素對應的內存空間中存儲的那個數)
(3)&a就是數組名a取地址,字面意思來看就應該是數組的地址。&a不能作左值(&a實質是一個常量,不是變量所以不能賦值,因此天然不能作左值。);&a作右值時表示整個數組的首地址。
(4)&a[0]字面意思就是數組第0個元素的首地址(搞清楚[]和&的優先級,[]的優先級要高於&,因此a先和[]結合再取地址)。作左值時表示數組首元素對應的內存空間,作右值時表示數組首元素的值(也就是數組首元素對應的內存空間中存儲的那個數值)。作右值時&a[0]等同於a。

解釋:爲何數組的地址是常量?由於數組是編譯器在內存中自動分配的。當咱們每次執行程序時,運行時都會幫咱們分配一塊內存給這個數組,只要完成了分配,這個數組的地址就定好了,本次程序運行直到終止都沒法再改了。那麼咱們在程序中只能經過&a來獲取這個分配的地址,卻不能去用賦值運算符修改它。

總結:
1:&a和a作右值時的區別:&a是整個數組的首地址,而a是數組首元素的首地址。這兩個在數字上是相等的,可是意義不相同。意義不相同會致使他們在參與運算的時候有不一樣的表現。
2:a和&a[0]作右值時意義和數值徹底相同,徹底能夠互相替代。
3:&a是常量,不能作左值。數組

4:a作左值表明整個數組全部空間,因此a不能作左值。指針

 

(1)int *p; int a[5]; p = a; // 類型匹配
(1)int *p; int a[5]; p = &a; // 類型不匹配。p是int *, &a是整個數組的指針,也就是一個數組指針類型,不是int指針類型,因此不匹配
(2)&a、a、&a[0]從數值上來看是徹底相等的,可是意義來看就不一樣了。內存

從意義上來看,a和&a[0]是數組首元素首地址,而&a是整個數組的首地址;編譯器

從類型來看,a和&a[0]是元素的指針,也就是int *類型;而&a是數組指針,是int (*)[5];類型。編譯

相關文章
相關標籤/搜索