Sizeof是c/c++中的關(guān)鍵字,它是一個(gè)運(yùn)算符,其作用是取得一個(gè)對(duì)象(數(shù)據(jù)類(lèi)型或數(shù)據(jù)對(duì)象)的長(zhǎng)度(即占用內(nèi)存的大小,以byte為單位)。其中類(lèi)型包括基本數(shù)據(jù)類(lèi)型(不包括void)、用戶(hù)自定義類(lèi)型(結(jié)構(gòu)體、類(lèi))、函數(shù)類(lèi)型。數(shù)據(jù)對(duì)象是指用前面提到的類(lèi)型定義的普通變量和指針變量(包含void指針)。
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)烏拉特前免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
十大特性:
特性0:sizeof是運(yùn)算符,不是函數(shù);
特性1:sizeof不能求void類(lèi)型的長(zhǎng)度;
特性2:sizeof能求void類(lèi)型的指針的長(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類(lèi)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é)果的類(lèi)型大小,但是它不對(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)類(lèi)型轉(zhuǎn)換的原因,表達(dá)式ch + num的計(jì)算結(jié)果類(lèi)型為int,因此n1=4;而ch=ch + num的計(jì)算結(jié)果為char,雖然在計(jì)算ch + num時(shí)結(jié)果為int,當(dāng)把結(jié)果賦給ch時(shí)又進(jìn)行了類(lèi)型轉(zhuǎn)換,因此表達(dá)式的最終類(lèi)型還是char,故n2=1。
特性7:sizeof可以對(duì)函數(shù)調(diào)用求大小,并且求得的大小等于返回類(lèi)型(函數(shù)類(lèi)型)的大小,但是不執(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)體的首地址的偏移量是其類(lèi)型的整數(shù)倍,比如說(shuō)double型成員相對(duì)于結(jié)構(gòu)體的首地址的地址偏移量應(yīng)該是8的倍數(shù);
c.為了滿(mǎn)足規(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)體的大小。
分享文章:關(guān)鍵字sizeof及其十大特性
本文來(lái)源:http://aaarwkj.com/article40/iipiho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣、外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、軟件開(kāi)發(fā)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)