陣列名和陣列名位址。

2021-08-13 09:28:11 字數 1853 閱讀 2045

先不說啥,上**,看**分析。 **是在vs2015下編譯的,debug

選的64

位。所以乙個指標占用

8個位元組。

int main(int argc,char** argv) ;

int  ca[6] = ;

printf("-----------------------------\n");

printf("----------主函式-------------\n");

printf("-----------------------------\n");

printf("1.         ca=%d\n", ca);

printf("2.       ca+1=%d\n", ca+1);

printf("3.        &ca=%d\n", &ca);

printf("4.      &ca+1=%d\n", &ca+1);

printf("5.   &(ca[0])=%d\n", &(ca[0]));

printf("6.   &(ca[1])=%d\n", &(ca[1]));

printf("-----------------------------\n");

printf("----------函式呼叫-----------\n");

printf("-----------------------------\n");

receive(ca);

system("pause");

return 0;

}void receive(intca)

執行結果如下:這裡用%d輸出沒有用%p,%d對數值來說更直觀點。

因為陣列是int型別的,陣列名為ca,在主函式裡面,ca在表示式中代表陣列元素的首位址(ca指向乙個

int型別,但是這個指向不能改變,ca是陣列名是個指標常量),即:ca=&(*(ca+0))=&(ca[0]),所以1和5相等。

ca+1=&(*(ca+1))=&(ca[1])所以2和6相等。

說下2的值:因為ca指向乙個int型別,所以步長位sizeof(int)=4,那麼ca+1=626455944+4=626455948

重點說下3和4:&ca代表的是不是位址的位址呢?在這裡不是。這裡涉及到陣列名和指標換用問題。在《c專家程式設計》書中第九章有詳細說

在「&ca」中這裡的ca不再代表陣列的首位址,所以在「&ca」中,ca不再是個位址,所以&ca不是表示位址的位址。

① 陣列作為sizeof()的運算元-顯然此時需要整個陣列的大小,而不是指標指向的第乙個元素大小。

② 使用&在操作符取陣列位址(在這裡情況)

③ 陣列是乙個字串常量初始值

那&ca到底是個什麼東西? 這裡&ca就是陣列的位址。但是&ca和ca有區別。區別就在於:指標型別不一樣。ca指向為int型別

&ca指向乙個陣列。ca→int ;&ca→int (*ca)(有點像二維陣列裡面的有木有)。

&ca+1,這裡的步長為 陣列元素個數*sizeof(int)。4的值=626455944+6*4=626455968

前面是說的是在主函式中,在函式呼叫的時候又點區別。區別在於&ca變了。

在函式呼叫是:傳的是陣列元素的首位址。所以ca在子函式中表示的是位址。那麼自然&ca表示的是 位址的位址。所以在這裡&ca是個二級指標。

在子函式中&ca值怎麼來? 在子函式呼叫時,系統會在棧中臨時開闢空間來儲存這個ca的值。所以&ca這個位址存的是ca的值。

為什麼&ca的值比其他小呢? 在windows中棧的生長方向是從高到低的。

&ca是個二級指標,所以&ca+1,步長為乙個指標占用的空間。這裡的debug選得64位,所以乙個指標大小位8個位元組。

&ca+1=626455904+8=626455912

陣列名和陣列名取位址

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

陣列名和陣列名取位址

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...

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

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