數組中幾個關鍵符號(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];類型。
