彻底弄懂C语言数组名
先定義一個一維數組
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };一、數組名是什么
數組名的值是數組首元素的指針常量。 
 數組名不是指針,但大多數使用到數組名的地方,編譯器都會把數組名隱式轉換成一個指向數組首元素的指針來處理。只有兩種情況下例外:
第一種是對數組名使用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 和 &a 的值是相同的。 
 a 的值是數組首元素的地址,它并不是一個指針。 
 “取一個數組名的地址所產生的是一個指向數組的指針,而不是一個指向某個指針常量值的指針”(出自《C和指針》第142頁)。
通過四條語句可以更好地理解它們的關系: 
 我知道%p用來輸出地址,但為了方便觀察我改用%d以整數形式輸出
可以很直觀地看出a和&a的區別了。 
 a指向首元素,右移一位,地址增加了4字節,也就是一個int的長度; 
 &a指向數組,右移一位,地址增加了40字節,相當于指向了下一個數組(實際上并不存在),或者說指向了數組a最后一個元素的下一個元素,這在C++里稱為尾后指針。
五、獲取數組元素個數
用數組的總字節長度除以單個元素的字節長度得到元素個數
sizeof(a) / sizeof(*a)總結
以上是生活随笔為你收集整理的彻底弄懂C语言数组名的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 使用gotoxy()函数移动控制台光标
 - 下一篇: 字符常量在C和C++中的区别