日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

彻底弄懂C语言数组名

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底弄懂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以整數形式輸出

printf("a = %d\n", a);printf("a + 1 = %d\n", a + 1);printf("&a = %d\n", &a);printf("&a + 1 = %d\n", &a + 1);

可以很直觀地看出a和&a的區別了。
a指向首元素,右移一位,地址增加了4字節,也就是一個int的長度;
&a指向數組,右移一位,地址增加了40字節,相當于指向了下一個數組(實際上并不存在),或者說指向了數組a最后一個元素的下一個元素,這在C++里稱為尾后指針。

五、獲取數組元素個數

用數組的總字節長度除以單個元素的字節長度得到元素個數

sizeof(a) / sizeof(*a)

總結

以上是生活随笔為你收集整理的彻底弄懂C语言数组名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。