C++primer 5.8sizeof 操作符--上(不同類型所佔用的內存大小字節)

簡介

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。
//
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章