關(guān)鍵字sizeof及其十大特性-創(chuàng)新互聯(lián)

   Sizeof是c/c++中的關(guān)鍵字,它是一個(gè)運(yùn)算符,其作用是取得一個(gè)對(duì)象(數(shù)據(jù)類型或數(shù)據(jù)對(duì)象)的長(zhǎng)度(即占用內(nèi)存的大小,以byte為單位)。其中類型包括基本數(shù)據(jù)類型(不包括void)、用戶自定義類型(結(jié)構(gòu)體、類)、函數(shù)類型。數(shù)據(jù)對(duì)象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。

創(chuàng)新互聯(lián)長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為烏魯木齊企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),烏魯木齊網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

十大特性:

特性0:sizeof是運(yùn)算符,不是函數(shù);

特性1:sizeof不能求void類型的長(zhǎng)度;

特性2:sizeof能求void類型的指針的長(zhǎng)度;

  其實(shí)指針也是變量,只不過(guò)這個(gè)變量很特殊,它是存放其它變量地址的變量,目前32位計(jì)算機(jī)平臺(tái)下的指針變量的大小為4。

特性3:sizeof能求得靜態(tài)分配內(nèi)存的數(shù)組的長(zhǎng)度;

注意:用sizeof求字符串的長(zhǎng)度時(shí)要加上末尾的‘/0’。

例:

void fun(int array[10])

{

int n = sizeof(array);

}

編輯程序:

#include<iostream>

using namespace std;

int fun(int array[10])

{

int n = sizeof(array);

return n;

}

int main()

{

int ret;

int array[10] = { 0 };

ret = fun(array);

cout << ret << endl;

system("pause");

return 0;

}

運(yùn)行結(jié)果:

4

請(qǐng)按任意鍵繼續(xù). . .

  在fun類n的值為4,而不是40,這是因?yàn)樵诤瘮?shù)參數(shù)傳遞時(shí),數(shù)組被轉(zhuǎn)化成指針了,假如直接傳遞整個(gè)數(shù)組的話,那么必然涉及到數(shù)組元素的拷貝(實(shí)參到形參的拷貝),當(dāng)數(shù)組非常大時(shí),會(huì)導(dǎo)致函數(shù)執(zhí)行效率極低,而只傳遞數(shù)組的地址(即指針),只需要拷貝4byte。

特性4:sizeof不能求動(dòng)態(tài)分配的內(nèi)存的大小;

特性5:sizeof不能對(duì)不完整的數(shù)組求長(zhǎng)度,否則會(huì)編譯出錯(cuò);

特性6:當(dāng)表達(dá)式作為sizeof的操作數(shù)時(shí),它返回的是表達(dá)式計(jì)算結(jié)果的類型大小,但是它不對(duì)表達(dá)式求值;

例:程序:

#include<iostream>

using namespace std;

int main()

{

char ch = 1;

int num = 1;

int n1 = sizeof(ch + num);

int n2 = sizeof(ch = ch + num);

cout << "n1=" << n1 << endl;

cout << "n2=" << n2 << endl;

system("pause");

return 0;

}

結(jié)果:

n1=4

n2=1

請(qǐng)按任意鍵繼續(xù). . .

  由于默認(rèn)類型轉(zhuǎn)換的原因,表達(dá)式ch + num的計(jì)算結(jié)果類型為int,因此n1=4;而ch=ch + num的計(jì)算結(jié)果為char,雖然在計(jì)算ch + num時(shí)結(jié)果為int,當(dāng)把結(jié)果賦給ch時(shí)又進(jìn)行了類型轉(zhuǎn)換,因此表達(dá)式的最終類型還是char,故n2=1。

特性7:sizeof可以對(duì)函數(shù)調(diào)用求大小,并且求得的大小等于返回類型(函數(shù)類型)的大小,但是不執(zhí)行函數(shù)體;

特性8:sizeof求得的結(jié)構(gòu)體(及其對(duì)象)的大小并不等于各個(gè)數(shù)據(jù)成員對(duì)象的大小之和;

規(guī)則:

a.結(jié)構(gòu)體的大小等于結(jié)構(gòu)體內(nèi)大成員大小的整數(shù)倍;

b.結(jié)構(gòu)體內(nèi)的成員的首地址相對(duì)于結(jié)構(gòu)體的首地址的偏移量是其類型的整數(shù)倍,比如說(shuō)double型成員相對(duì)于結(jié)構(gòu)體的首地址的地址偏移量應(yīng)該是8的倍數(shù);

c.為了滿足規(guī)則1和2,編譯器會(huì)在結(jié)構(gòu)體成員之后進(jìn)行字節(jié)填充;

例:程序:

#include<iostream>

using namespace std;

int main()

{

struct A

{

int num1 = 0;

int num2 = 0;

double num3 = 0;

};

struct B

{

int n1 = 0;

double n2 = 0;

int n3 = 0;

};

cout << "A=" << sizeof(A) << endl;

cout << "B=" << sizeof(B) << endl;

system("pause");

return 0;

}

結(jié)果:

A=16

B=24

請(qǐng)按任意鍵繼續(xù). . .

sizeof(A):4+4+8=16

sizeof(B):4(n1占用地址空間:0,1,2,3)+4(不夠8的倍數(shù)填充4個(gè)地址空間,4,5,6,7)+8(n2占用地址空間:8-15)+4(n3占用地址空間:16-19)+4(不夠8的倍數(shù)填充4個(gè),20,21,22,23)=24。

特性9:sizeof不能用于求結(jié)構(gòu)體的位域成員的大小,但是可以求得包含位域成員的結(jié)構(gòu)體的大小。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

新聞名稱:關(guān)鍵字sizeof及其十大特性-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://bm7419.com/article28/dcoojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、定制開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站內(nèi)鏈、網(wǎng)站制作云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)