陣列名和陣列名取位址

2021-08-29 01:10:48 字數 878 閱讀 3635

1 int a[10];

2 int *p = a;

3 int (*q)[10] = &a;

第二個為指向陣列的指標.

a只是a[0]的位址,a+1就是a[1]的位址了,

&a是整個a[10]的首位址,是以整個陣列為角度來看,雖然它與a[0]的值相同,但是&a+1就已經增加了10個int型別的位元組的長度了.

1 #include

2 3 int a[2] = ;

4 int main()

本機(linux)結果輸出:

a = 0x804a014

&a = 0x804a014

a + 1 = 0x804a018

&a + 1 = 0x804a01c

沒錯,上面i 和 ii列印出來的位址是一樣的,iv 要比 iii 大4個位元組的位址空間。下面是我對這一現象的解釋,如有不妥的地方請各位大蝦一定給於指出:

首先引用《c和指標》p141中的理論:

在c中, 在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第乙個元素的位址。 它的型別取決於陣列元素的型別: 如果它們是int型別,那麼陣列名的型別就是「指向int的常量指標「。

看到這裡我想應該就知道為什麼 會有i 和 iii式的結果了。

對於ii 和 iv 則是特殊情況,在《c和指標》p142中說到:

在以下兩中場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符&的運算元時。

sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。 取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量的指標。

&a後返回的指標便是指向陣列的指標,跟a(乙個指向a[0]的指標)在指標的型別上是有區別的。

原文: 

陣列名和陣列名取位址

在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量 也就是陣列第乙個元素的位址。它的型別取決於陣列元素的型別 如果它們是int型別,那麼陣列名的型別就是 指向int的常量指標 在以下兩種場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符 的運算元時。siz...

陣列名和陣列名取位址的區別

以下 會列印出什麼樣的日誌呢?cpp view plain copy include int a 2 int main 本機 linux 結果輸出 a 0x804a014 a 0x804a014 a 1 0x804a018 a 1 0x804a01c 沒錯,上面i 和 ii列印出來的位址是一樣的,i...

陣列名和陣列名取位址的區別

include int main 執行效果 printf d n sizeof a 結果20,有點陶醉.a,既然是指向陣列結構的指標,不應該大小為20.其實,ps 如果是 int a 1,則結果是1245037 即1245036 1 揭密陣列名 陣列名的內涵在於其指代實體是一種資料結構,這種資料結構...