謝邀。
在C語(yǔ)言程序開發(fā)中,sizeof()是一個(gè)常用,也是一個(gè)非常有用的關(guān)鍵字,程序員常常使用它來獲取變量占用內(nèi)存的字節(jié)數(shù)。
稱sizeof()為“關(guān)鍵字”,是因?yàn)殡m然sizeof()使用起來很像一個(gè)函數(shù),但是它與函數(shù)還是有很大區(qū)別的,這一點(diǎn)我之前的文章討論過。
小技巧:避免“硬解碼”造成的代碼維護(hù)困難
例如下面這樣的例子,請(qǐng)看相關(guān)C語(yǔ)言代碼如下:
size就等于x在內(nèi)存中占用的字節(jié)數(shù)。在固定的機(jī)器平臺(tái),變量x是float類型,占用的內(nèi)存字節(jié)數(shù)是固定的,例如float類型在pc上常占用4字節(jié)內(nèi)存空間。
之所以不直接使用4,而是使用sizeof(x)是為了方便以后的維護(hù)。可以想象,若以后發(fā)現(xiàn)x需要使用更長(zhǎng)的數(shù)據(jù)類型double才能滿足需求,只需將floatx;修改為doublex;就可以了,size會(huì)自己適應(yīng)修改。
其實(shí)不僅C語(yǔ)言,在其他語(yǔ)言的程序開發(fā)中,都有這樣一個(gè)原則:
sizeof()獲取數(shù)組長(zhǎng)度的“陷阱”
很多時(shí)候,利用sizeof()還可以獲取數(shù)組的長(zhǎng)度,例如下面這兩行C語(yǔ)言代碼:
len此時(shí)等于128,也即數(shù)組str的長(zhǎng)度。但是如果數(shù)組不是char型的,而是其他類型的,len還等于數(shù)組長(zhǎng)度嗎?編寫如下C語(yǔ)言程序:
編譯并執(zhí)行這段C語(yǔ)言代碼,得到如下結(jié)果:
顯然,len并不等于arr的長(zhǎng)度10,而是等于40。很多C語(yǔ)言初學(xué)者看到這里會(huì)感到迷惑,怎么回事?sizeof(數(shù)組名)不是等于數(shù)組長(zhǎng)度的嗎?
sizeof()關(guān)鍵字從來就不是計(jì)算長(zhǎng)度的關(guān)鍵字,而是獲取變量占內(nèi)存空間字節(jié)數(shù)的關(guān)鍵字,這一點(diǎn)要謹(jǐn)記。str是一個(gè)長(zhǎng)度為128的char型數(shù)組,它占用內(nèi)存字節(jié)數(shù)恰好等于128,是因?yàn)閟tr的每一個(gè)元素都是char型的,而char型占用一個(gè)字節(jié)的內(nèi)存空間,因此此時(shí)str占用內(nèi)存字節(jié)數(shù)和它的長(zhǎng)度恰好是相等的。
再來看數(shù)組arr,它的長(zhǎng)度等于10,但是它的每個(gè)元素都是int型的,而在我的機(jī)器上int型變量占用4字節(jié)內(nèi)存空間,所以arr一共占用40字節(jié)內(nèi)存空間,因此sizeof(arr)等于40,而不是10。
獲取數(shù)組長(zhǎng)度的小技巧
現(xiàn)在知道sizeof()有時(shí)無法直接獲取數(shù)組長(zhǎng)度的原因了,我們完全可以如下定義一個(gè)方法,用于計(jì)算數(shù)組長(zhǎng)度,相關(guān)C語(yǔ)言代碼如下,請(qǐng)看:
sizeof(數(shù)組名)計(jì)算的是整個(gè)數(shù)組占用的內(nèi)存字節(jié)數(shù),而sizeof(*x)等價(jià)于sizeof(x[0]),也即數(shù)組第一個(gè)元素占用的內(nèi)存字節(jié)數(shù)。因?yàn)閿?shù)組中各個(gè)元素的類型是相同的,所以sizeof(*x)也可以認(rèn)為是每一個(gè)數(shù)組元素占用的內(nèi)存字節(jié)數(shù)。上述宏定義就相當(dāng)于:
數(shù)組長(zhǎng)度=數(shù)組所有元素占用內(nèi)存字節(jié)數(shù)/每個(gè)元素占用內(nèi)存字節(jié)數(shù)
這么看來,arr_len就不難理解了。編寫如下C語(yǔ)言程序測(cè)試一下arr_len:
編譯并執(zhí)行上面這段C語(yǔ)言程序,得到如下輸出:
顯然,arr_len計(jì)算其他類型數(shù)組的長(zhǎng)度也不在話下。