簡介
sizeof 的總結: http://blog.csdn.net/xyh_adolph/article/details/21187783
sizeof計算數據(包括數組、變量、類型、結構體等)所佔內存空間,用字節數表示,返回值類型是size_t
對char 類型或值爲char 類型的表達式做sizeof 操作保證得1;
對引用類型做sizeof 操作將返回存放此引用類型對象所需的內存空間大小;
對指針做sizeof操作,返回存放指針所需的內存大小(4字節)
注意,如果需獲取該指針所指向對象類型的大小(如int 對象那麼是4字節),則必須對該指針進行解引用。
特別要注意的時,對於指針類型,都佔4個字節,因爲指針指向的是一個地址,32位操作系統就是4字節。當然如果是64位操作系統那就是8字節了。所以一般情況下 sizeof (p)=4
對數組做sizeof操作等效於將對其元素類型做sizeof操作的結果乘上數組元素的個數。因爲sizeof返回整個數組在內存中的存儲長度;
用sizeof 數組的結果除以sizeof其元素類型的結果,即可求出數組元素的個數。
==================================================================================================
一、關於sizeof
- sizeof計算數據(包括數組、變量、類型、結構體等)所佔內存空間,用字節數表示,返回值類型是size_t
- sizeof(變量)就是求 p30那些類型所佔字節(常用的!!!記住!!!)
- sizeof 表達式的結果是編譯時常量,有三種語法形式:
- sizeof (type name);
- sizeof (expr);
- sizeof expr;
Sale_item item,*p;
sizeof(Sale_item);
sizeof item;
sizeof *p;
將sizeof 應用在表達式expr上,將獲得該表達式的結果的類型的長度(還是針對類型) ;
將sizeof用於expr時,並沒有計算表達式expr的值。。
使用sizeof 的結果部分地依賴所涉及的類型:
對char 類型或值爲char 類型的表達式做sizeof 操作保證得1 相當於sizeof(char);
對引用類型做sizeof 操作將返回存放此引用類型對象所需的內存空間大小;
對指針做sizeof操作,返回存放指針所需的內存大小( 4 字 節 !!!! ):如 sizeof (p)=4
注意,如果需獲取該指針所指向對象類型的大小,則必須對該指針進行解引用。sizeof (* p),根據 指針p的類型,如果p是整型,那麼就是 4 字節
特別要注意的時,對於指針類型,都佔4個字節,因爲指針指向的是一個地址,32位操作系統就是4字節。當然如果是64位操作系統那就是8字節了。所以一般情況下 sizeof (p)=4
對數組做sizeof操作等效於將對其元素類型做sizeof操作的結果乘上數組元素的個數。因爲sizeof返回整個數組在內存中的存儲長度;
用sizeof 數組的結果除以sizeof其元素類型的結果,即可求出數組元素的個數。
//例子1
double y[10]; //double 類型的數組,每個double類型佔8字節
int x[10]; //int 類型的數組,每個int類型佔4字節
int *p=x;
double *p1=y; //double類型的指針才能指向double類型的數組,別寫成int *p1=y
char q='a';
cout<<sizeof(q)<<endl; //輸出的是1
cout<<sizeof(x)<<endl; //sizeof(數組名),輸出的是整個數組在內存中的存儲長度,輸出的是4*10=40
cout<<sizeof(y)<<endl; //sizeof(數組名),輸出的是整個數組在內存中的存儲長度,輸出的是80
cout<<sizeof(p)<<endl;//sizeof(指針),輸出的是指針所需內存大小,4個字節
cout<<sizeof(p1)<<endl;//sizeof(指針),輸出的是指針所需內存大小,4個字節
cout<<sizeof(*x)<<endl;//*x=x[0]的值,x[0]是int型的數,所以輸出的是整型數所佔用的空間大小4字節
cout<<sizeof(*y)<<endl;//*y=y[0]的值,所以輸出的是double型數所佔用的空間大小8字節
cout<<sizeof(*p)<<endl;//輸出指針p所指對象x[0]所佔大小,因爲是int型,所以輸出的是4
cout<<sizeof(*p1)<<endl;//輸出指針p所指對象y[0]所佔大小,因爲是double型,所以輸出的是8
cout<<sizeof(x)/sizeof(*x)<<endl;//輸出數組元素的個數,是10
cout<<sizeof(p)/sizeof(*p)<<endl;//輸出元素的個數,是1
//輸出結果
1
40
80
4
4
4
8
4
8
10
1
//上機實踐一下這題
void Func ( char str[100])
{
sizeof( str ) = 4 //數組名str做形參時,是一個指針,所以爲4
}
//str 是數組名
char str[] = “Hello” ;
char *p = str ;
int n = 10;
sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) = 4
//例子2 用sizeof()函數計算每種類型變量所佔用的內存大小,用字節表示
int main()
{
int a;
long b;
int *c;
char *d;
string s1("helloworld");
int Byteof_int=sizeof(a);
int Byteof_long=sizeof(b);
int Byteof_int_point=sizeof(c);
int Byteof_char_point=sizeof(d);
int Byteof_string=sizeof(s1);
cout << "int:" <<Byteof_int<<endl;
cout << "long:" <<Byteof_long<<endl;
cout << "int *:" <<Byteof_int_point<<endl;
cout << "char *:" <<Byteof_char_point<<endl;
cout << "string:" <<Byteof_string<<endl;
return 0;
}
//顯示結果
/*
int : 4
long :4
int *:4
char *:4
string:4
//總結
int : 4 字節
long :4 字節
bool:1字節
char:1字節
wchar_t:2字節
float:4字節
double:8 字節
指針類型:4 字節
string類型:4字節
//習 題 5.18 string類指針和string類對象用sizeof
int main(){
//讀取vector對象與初始化該對象
vector<string*> spvec; //注意是string 類型的指針,所以*不要忘記
string str;
cout<<"enter string (ctrl+z to end)"<<endl;
while(cin>>str)
{string *pstr=new string;//指向string對象的指針
*pstr=str;
spvec.push_back(pstr);
}
//輸出每個string的內容及其相應的長度
vector<string*>::iterator iter=spvec.begin();
while(iter!=spvec.end())
{
cout<<(**iter)<<endl;//使用的是vector裏面的迭代器iter ,所以第一次解引用時,求得的是vector裏面的元素,即string類的指針,第二次解引用求得的是該指針指向的對象的值
cout<<(**iter).size()<<endl;//因爲是要輸出string的長度,即裏面有幾個元素,那麼就使用string對象自帶的size函數
cout<<sizeof(*iter)<<endl;//*iter表示的是string類型的指針,相當於是sizeof(string *),對指針使用sizeof函數,將返回存放該指針所需的內存大小,返回4字節
cout<<sizeof(**iter)<<endl;//**iter是string指針所指的string對象,sizeof(**iter)求得的就是指針所指的對象的大小,string類型佔用內存的大小是 4字節
iter++;
}
//釋放各個動態分配的string對象
iter =spvec.begin();
while(iter!=spvec.end())
{delete *iter; //刪除string對象所佔用的內存空間,所以是*iter
iter++;}
return 0;
}
//輸入:abcde qwertyu
//輸出結果:
abcde qwertyu
5 7
4 4
4 4
//指針均可看爲變量類型的一種。所有指針變量的sizeof 操作結果均爲4。
//