国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【C深度剖析】sizeof操作符與數(shù)組

2021-08-20 10:39 作者:Vecloud_  | 我要投稿


sizeof操作符與數(shù)組?
一、?sizeof是何方神圣?

說到sizeof,首先必須知道的一點:sizeof不是函數(shù),sizeof是操作符。sizeof的作用就是,計算一個對象或類型所占的內(nèi)存字節(jié)數(shù)。?


1.1 sizeof的語法?
sizeof():?
這也正是為什么sizeof會有那么多人誤解其為函數(shù)。括號里面可以是一個數(shù)據(jù)對象,也可以是一個數(shù)據(jù)類型。對于有括號的這種語法來說,你大可以不用理會括號里面是一個數(shù)據(jù)類型還是一個數(shù)據(jù)對象。?

sizeof object:?
初次見面,以為是語法錯誤,其實這也是sizeof的一種用法,計算數(shù)據(jù)對象所占的內(nèi)存字節(jié)數(shù)。如果計算的是一個數(shù)據(jù)類型,那么請用上面的括號形式。如此看來,那么多程序員使用()的語法形式是有道理的,因為放之四海皆準。?


1.2 sizeof如何計算大小?

如果你學習過JAVA,那么你會發(fā)現(xiàn),JAVA中根本不存在sizeof操作符。難道是因為JAVA不夠完善嗎?其實不然。JAVA之所以沒有sizeof操作符,也正如JAVA設計者所言:JAVA不需要sizeof。JAVA的運行時需要JVM的,不同的操作系統(tǒng)都有對應的JVM,在JVM中保證了所有類型的大小一致,不管你運行在32位還是64位的機器上,數(shù)據(jù)類型的大小都是已知的,這也正是JAVA可移植性能夠?qū)崿F(xiàn)的最根本的原因?;氐皆掝}來,為什么C/C++需要sizeof?顯然,對于一個合格的C程序員,我們應該知道,我們所寫的程序運行在不同結(jié)構(gòu)的機器上的時候,類型的大小有所區(qū)別。當我們需要知道一個類型的大小才能繼續(xù)寫程序的時候,我們就需要sizeof。這就是為什么我們需要sizeof。?

二、?數(shù)組并沒有那么簡單?
數(shù)組和指針是C語言中的重頭戲,那么數(shù)組是什么數(shù)據(jù)類型呢?按照其他書籍的介紹,數(shù)組是復合類型(與基本數(shù)據(jù)類型結(jié)合構(gòu)成的類型)。數(shù)組是同一類型的數(shù)據(jù)的集合,在內(nèi)存中的表現(xiàn)為一串連續(xù)的內(nèi)存,內(nèi)存的大小為單個數(shù)據(jù)類型的大小與數(shù)據(jù)量的乘積。在我個人看來,數(shù)組更應該稱為數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)中的順序表,其實現(xiàn)的核心就是數(shù)組。由此可見,數(shù)組更像是一種C語言預先定義的數(shù)據(jù)結(jié)構(gòu)。?


?2.1?數(shù)組的語法?







數(shù)據(jù)類型?數(shù)組名[數(shù)據(jù)個數(shù)]?
倘若我們在定義的時候就初始化,那么數(shù)組中第一個維度的數(shù)據(jù)大小可以不寫。?

?2.2?數(shù)組名到底是什么?

數(shù)組名是一段內(nèi)存空間的名字,其指向了這段內(nèi)存空間。我們講到了sizeof,那么sizeof(數(shù)組名)計算出來的,理所應當計算的就是數(shù)組名指向的這段內(nèi)存空間的字節(jié)數(shù),事實也正是如此。但是,當我們對數(shù)組名繼續(xù)深究下去,我們就會開始對sizeof(數(shù)組名)疑惑了??聪旅娴睦樱?
intarr[3]={0,1,2};printf(“%p”,arr);?
上面的例子,打印的將會是數(shù)組首元素的地址。由此我們可以推測:arr是一個指針。我們這么推測是有理由的,因為指針才能存儲一個地址。但是倘若我們想現(xiàn)在下定論,就需要考慮sizeof(arr)。這時候你再來回答,sizeof(arr)的大小是多少。兩種答案:4或者12。答案是4的顯示,我們把arr當做一個指針,指針的內(nèi)存在所占的字節(jié)數(shù)為4;12則是把數(shù)組名看做一種數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)的大小為12字節(jié)。正確答案大家知道是12。到這里我們的疑惑就更深了,既然編譯器認為arr不是指針,但是arr在打印地址的時候,又保存了一個地址。這就是我們需要說的:數(shù)組名是一個類似于指針的數(shù)據(jù)結(jié)構(gòu)變量名。在普通情況下,我們可以把數(shù)組名當做指針來使用。繼續(xù)看下面的一個例子:?
intarr[3]={0,1,2};intarr2[3]={3,4,5};arr=arr2;上面的代碼我們想完成的事情是將arr2數(shù)組賦值給arr數(shù)組,但是編譯的時候是錯誤的,因為arr在表現(xiàn)為指針屬性的時候,實際上是一個常量指針。我們不會對一個已經(jīng)初始化了的變量再次賦值。?
?2.3?數(shù)組作為函數(shù)參數(shù)?
?當數(shù)組作為函數(shù)形參的時候,數(shù)組名則淪為指針,既然是一個指針,我們就可以對其自增、自減和修改。在函數(shù)體內(nèi),數(shù)組名僅僅作為一個數(shù)組的指針。我們知道了他是指針,只要我們搞清楚這個指針實際指向的數(shù)據(jù)類型,那么對于指針的使用就顯得簡單了。?



三、?sizeof與數(shù)組?

看下面的一段代碼:?
intarr[2][2]={{0,1},{2,3}};printf(“%d,”,sizeof(arr));printf(“%d,”,sizeof(arr[0]));printf(“%d\n”,sizeof(arr[0][0]));?
三個printf將會打印什么?答案:16,8,4?


?3.1 sizeof(arr)?



弄清楚答案的緣由我們先了解一下多維數(shù)組。?
C/C++中,多維數(shù)組實際上是一位數(shù)組。多維數(shù)組在分配內(nèi)存的時候,是分配一段完整的連續(xù)的內(nèi)存空間。這么說可能理解不深刻。我們先來了解一下JAVA中的多維數(shù)組,就以二維數(shù)組來看。JAVA中的二維數(shù)組在分配空間的時候,首先會分配一個大小為2的數(shù)組,其保存的是2個一維數(shù)組的起始地址。這兩個一維數(shù)組在內(nèi)存上并不一定是連續(xù)的。再看看C中的數(shù)組,就能理解其完整的連續(xù)的意思。?
正是因為如此,所以sizeof(arr)才會打印16。因為sizeof計算的是數(shù)組名對應的內(nèi)存空間的大小,不管維度大小。?


?3.2 sizeof(arr[0])?


?接下來我們看一下sizeof(arr[0])。如果外面沒有sizeof操作符,arr[0]在此處如果換成指針來看待,其運算如下:(arr + 0 ),其指向的依然是數(shù)組的首行首元素的地址。但是在sizeof操作符下,arr[0]顯然不能夠當做指針來看待,這時應該理解為二維數(shù)組的一維數(shù)組(邏輯上是如此,實際上多維數(shù)組還是一位數(shù)組)。arr[0]指向的是第一行的一位數(shù)組,我們可以理解為arr[0]就是一個數(shù)組名,其內(nèi)存空間為arr數(shù)組的前2個元素對應的內(nèi)存空間,我們sizeof,得到的結(jié)果就應該為8。?


?3.2 sizeof(arr[0][0])?

最后來看sizeof(arr[0][0]),arr[0][0]表示訪問的是二維數(shù)組的首行一維數(shù)組的首元素,其變量就是一個int類型,所以結(jié)果為4。?
由此看來,數(shù)組名與sizeof操作符搭配的時候,其表現(xiàn)也并不簡單,其依然還是保留了數(shù)組名作為一種數(shù)據(jù)結(jié)構(gòu)的特性。

了解更多網(wǎng)絡知識關(guān)注:http://www.vecloud.com/

【C深度剖析】sizeof操作符與數(shù)組的評論 (共 條)

分享到微博請遵守國家法律
望谟县| 清远市| 乐山市| 忻州市| 安康市| 尖扎县| 绍兴县| 岢岚县| 高平市| 宝丰县| 襄城县| 漳平市| 拜泉县| 西乌珠穆沁旗| 库车县| 文山县| 华蓥市| 翁源县| 威海市| 江阴市| 大城县| 同德县| 响水县| 曲阳县| 贡山| 毕节市| 霍山县| 东丽区| 楚雄市| 宜昌市| 廊坊市| 德阳市| 五原县| 聂拉木县| 永嘉县| 和田市| 铜山县| 泰兴市| 稻城县| 翼城县| 肃宁县|