**:
先定義乙個一維陣列
int a
=;
陣列名的值是陣列首元素的指標常量。
陣列名不是指標,但大多數使用到陣列名的地方,編譯器都會把陣列名隱式轉換成乙個指向陣列首元素的指標來處理。只有兩種情況下例外:
第一種是對陣列名使用sizeof
運算子
sizeof
(a)
這將會得到整個陣列所佔的記憶體大小,a是長度為10的int(4位元組)陣列,運算結果是40
第二種是對陣列名取位址
&a
運算結果是陣列的位址。注意,陣列的位址和陣列首元素的位址是不同的概念,儘管二者的值是相同的。
除了上面說的兩種例外,其他情況下編譯器都將陣列名隱式轉換成指標常量。比如使用下標引用陣列元素:
a
[3] // 自動轉換成下面的表示式
*(a + 3
)
a的值被轉換成指標常量,指向第乙個元素,向右移動3 * sizeof(int)
個位元組,然後解引用,便得到了第4個元素的內容。
因為第一種寫法會自動轉換成第二種,這個過程需要一些開銷,所以我們說第二種寫法通常效率會高一些。
以陣列a
為例,a
的型別是:
int
*
陣列的型別取決於陣列元素的型別:如果它們是int
型別,那麼陣列名的型別就是「指向int的常量指標」;如果它們是其他型別,那麼陣列名的型別就是「指向其他型別的常量指標」。(出自《c和指標》第141頁)
這裡需要補充兩點,&a
的型別和二維陣列名的型別。
在接下來的第四點會詳細解釋&a
的含義,這裡先給出結論,&a
是指向陣列的指標,而&a
的型別是int (*)[10]
。
然後二維陣列的型別同樣取決於陣列元素的型別,假設有二維陣列int b[10][20]
因為c語言的多維陣列實際上是一維陣列,二維陣列實際上只是乙個一維陣列,只不過裡面每個元素又是乙個一維陣列而已。所以b
的型別是int (*)[20]
,而&b
的型別是int (*)[10][20]
乙個有趣的事實是,a
和&a
的值是相同的。
a
的值是陣列首元素的位址,它並不是乙個指標。
「取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量值的指標」(出自《c和指標》第142頁)。
可以很直觀地看出a
和&a
的區別了。
a
指向首元素,右移一位,位址增加了4位元組,也就是乙個int
的長度;
&a
指向陣列,右移一位,位址增加了40位元組,相當於指向了下乙個陣列(實際上並不存在),或者說指向了陣列a
最後乙個元素的下乙個元素,這在c++裡稱為尾後指標。
用陣列的總位元組長度除以單個元素的位元組長度得到元素個數
sizeof
(a)/
sizeof
(*a)
徹底弄懂C語言陣列名
先定義乙個一維陣列 int a 陣列名的值是陣列首元素的指標常量。陣列名不是指標,但大多數使用到陣列名的地方,編譯器都會把陣列名隱式轉換成乙個指向陣列首元素的指標來處理。只有兩種情況下例外 第一種是對陣列名使用sizeof運算子 sizeof a 這將會得到整個陣列所佔的記憶體大小,a是長度為10的...
c語言 陣列名和 陣列名的區別
在學習c語言的過程中我們可以發現乙個一維陣列的的陣列名往往具有兩層含義 一.作為陣列名代表整個陣列 二.作為指標代表陣列的首元素位址 因此很容易把陣列和指標混為一談 我們可以發現陣列名等價於乙個指向陣列首位址的指標。當陣列名代表整個陣列的時候是在以下兩種情況 1.在用sizeof關鍵字求陣列所佔的記...
C語言 陣列名與 陣列名的區別
char str 10 str 的值為str 0 的位址值,型別為char 型 str的值為陣列的首位址,型別為char 此處,兩者的值是相同的。所以在使用的時候要注意指標的型別,值相同,型別不同也是不對的 include include include include contact.h int ...