在大多數情況下,一個表達陣列型(「的T
N元件陣列‘)的將與/轉換爲/‘衰變’到指針類型的表達式(’指針T
」)代替,並且表達式的值將是數組中第一個元素的地址。
因此,假設申報
int a[10];
的表達式的類型a
是 「的int
10元件陣列」,或int [10]
。但是,在大多數情況下,表達式的類型將轉換爲「指向int
」或int *
,表達式的值將等於&a[0]
。
此規則的例外是數組表達式是sizeof
或一元&
運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字。
因此,基於我們的聲明之上,以下所有條件都爲真:
Expression Type Decays to Value
---------- ---- --------- -----
a int [10] int * address of the first element of a
&a int (*)[10] n/a address of the array, which is the
same as the address of the first
element
&a[0] int * n/a address of the first element of a
*a int n/a value of a[0]
sizeof a size_t n/a number of bytes in the array
(10 * sizeof (int))
sizeof &a size_t n/a number of bytes in a pointer to
an array of int
sizeof *a size_t n/a number of bytes in an int
sizeof &a[0] size_t n/a number of bytes in a pointer to int
注意表達a
,&a
和&a[0]
都具有相同的值(的第一個元素的地址a
),但類型不同。類型很重要。假定:
int a[10];
int *p = a;
int (*pa)[10] = &a;
兩個p
和pa
點的a
的第一要素,我們將假定是在地址0x8000
。執行線
p++;
pa++;
然而,p
指向下一整數(0x8004
,假定4字節int
S)後,邊pa
指向整數的下一10元件陣列;也就是a
(0x8028
)的最後一個元素之後的第一個整數。
你能告訴我更多關於這一點的信息:它位於相同的內存地址,但它不同。我不明白這一點,因爲我認爲,如果它找到了相同的地址,它應該是相同的。謝謝:) – hqt 2012-08-09 14:02:05
@hqt地址**是**相同的,但重點是'msg'和'msg [0]'會有不同的表現。他們是兩種不同的類型。查看關於指針算術的註釋,例如'(&msg + 1)'並自己嘗試。 – pb2q 2012-08-09 14:05:54
@hqt尺寸不同。數組msg佔用16個字節,其第一個元素只佔用這些字節中的第一個。這就像結構的第一個成員的地址與結構的地址一樣,但它們是不同的東西。如果你有一個x字節的實體A位於某個地址,而一個實體B的y字節位於相同的地址,那麼如果'x!= y',A和B是不同的實體。 (即使'x == y',它們也可以是不同的實體。) – 2012-08-09 14:06:06