總結一些C語言中關於數組和指針的關係。
1、"[]" 運算。下標運算"[]"實際上是由另一個運算定義的。C語言規定下面兩個表達式 表達式1[表達式2] 與 ( *( (表達式1)+(表達式2) ) )
是完全等價的。由於"+"具有交換性,故 表達式1[表達式2] 與 表達式2[表達式1]完全等價,例如 int i[1] = 7; i[0] = 0[i] = 7。
2、數組名是指針,指向數組第一個元素,是常量。 double d [6] = {2}; "d[0]" 等價於 "( *( (d)+(0) ) )" ,也就等價於"*d",而"*"做一元運算符時運算對象是指針,故 "d"是一個 "int *"類型的指針,數組名是指針。
3、數組名不僅僅是指針,也代表數組所佔據的那塊內存
4、指向數組的指針。對於數組,由於數組名也可以代表數組所佔據的內存,所以也可以由數組名得到數組的指針。int a[20];
"a" 與"&a"都是指針常量,值相同,但是數據類型不同。"a"是 "int *"類型指針,加1意味着在數值上加上 "sizeof (int)",而"&a"是 指向一個 "int [20]"這樣的數組,因而加1意味着加上 ”sizeof(int [20])"。
5、與數組名對應的形參。在用數組名做實參時,形參對應的數據類型可以用不完全類型描述,實際上是一種指針類型。int a[10],a做實參時,形參類型應該是 int [] 即 int *。
6、高維數組名是指針。如 int a[2][3]; a是指向一個由3個 int類型數據構成的一維數組的指針(int (*) [3]),即a[0] 。注意 與int * [3]不同,int * [3]是定義一個數組,數組元素爲int類型指針。注意a 與&a 加1結果是不同的,類似一維數組。
7、高維數組名是內存,二維數組所佔據的那塊內存。
參考資料:狂人C-程序員入門必備(關於指針的章節)