天天看點

(c/c++學習筆記一) sizeof基本知識

一.定義:

    c\c++操作符,傳回一個對象或者類型所占用的記憶體位元組數,傳回類型為size_t

二.文法:

    1.sizeof(對象)   2.sizeof(類型)   3.sizeof 對象

    知識點:

    a).sizeof計算對象大小其實也是轉換成計算對象的類型大小,是以同類型不同對象的sizeof值是一樣的。

    b).sizeof可以對一個表達式求值,編輯器根據表達式最終結果的類型來确定值的大小,一般不會對表達式進行計算,如sizeof(2+3.14) //3.14的類型是double,2也會提升為double,是以等價于sizeof(double)

    c).sizeof也可以對一個函數調用求值,其結果是函數傳回類型的大小,函數并不會被調用。

        例:

char foo()
{
    printf("foo() has been called./n");
    return 'a';
}
int main()
{
    size_t sz = sizeof( foo() ); // foo() 的傳回值類型為char,是以sz = sizeof( char ),foo()并不會被調用
    printf("sizeof( foo() ) = %d/n", sz); 
}
           

    d).c99規定,函數、不能确定類型的表達式已經位域成員不能被計算sizeof的值,下列寫法都是錯誤的:

sizeof( foo ); // error
void foo2() { }
sizeof( foo2() ); // error

struct S
{
    unsigned int f1 : 1;
    unsigned int f2 : 5;
    unsigned int f3 : 12;
};
sizeof( S.f1 ); // error    
           

三.sizeof的常量性

    sizeof的計算發生在編譯時刻,是以它可以被當做常量表達式使用,如圖 int a[sizeof(int)*10];

    c99标準規定,sizeof也可以在運作時計算(為了增強代碼的可移植性,還是認為它是在編譯時刻計算吧)

四.基本資料類型的sizeof

    這裡的基本資料類型是指char short int  long float double這樣的簡單内置資料類型,它們都是和系統相關的,在不同系統下取值可能不同,一般情況下,在32位編譯環境中,sizeof(int)的值是4

五.指針變量的sizeof

    指針變量用來儲存位址的,等于計算機内部位址總線的寬度,在32位計算機上,sizeof對指針變量求值必定傳回4位元組。

六.數組的sizeof

    數組的sizeof等于數組所占用的記憶體位元組數,如char a1[] = "abc";   int a2[3];   sizeof(a1); //結果為4 最後還有一個‘\0’    sizeof(a2); \\結果是12   int占用4位元組 3個int是12

    利用sizeof求數組元素個數 int c1 = sizeof(a1)/sizeof(char);    int c2 = sizeof(a2)/sizeof(a2[0]);  c2 = sizeof(a2)/sizeof(*a2);

void foo3(char a3[3])
{
    int c3 = sizeof( a3 ); // c3 == ?
}
           

    數組作為函數的參數 a3為指針類型,相當于 char* a3,  是以sizeof(a3)的值是4。