C語言中的sizeof 操作符

簡(jiǎn)介:

今天在讀《c專家編程》的時(shí)候看到第38頁里面說到“當(dāng)sizeof的操作數(shù)是類型名時(shí),兩邊必須加上括號(hào)(這常使人們誤以為sizeof是個(gè)函數(shù)),但操作數(shù)如果是變量則不必加括號(hào)”。巧了,我之前一直以為sizeof是函數(shù)......,這里查查手冊(cè)記錄一下。

1. sizeof 運(yùn)算符

sizeof 返回一個(gè)表達(dá)式或者一個(gè)類型名所占的字節(jié)數(shù),使用語法有兩種:
(1) sizeof( type ); //返回type類型所占的字節(jié)數(shù)
(2) sizeof expression; //返回expression結(jié)果類型的大?。ú⒉挥?jì)算表達(dá)式實(shí)際的值)
注:根據(jù)計(jì)算架構(gòu)不同一個(gè)字節(jié)的比特?cái)?shù)可能不一樣,但是按照標(biāo)準(zhǔn)下面的表達(dá)式都應(yīng)該是1byte

  • sizeof(char)
  • sizeof(signed char)
  • sizeof(unsigned char)

2. 示例

struct myData {
    int a;
    char b;
};

void test_c()
{
    //計(jì)算數(shù)組的長度,
    //一般情況下把數(shù)組名視為數(shù)組第一個(gè)元素的地址
    //例外情況是使用 sizeof 操作符作用于數(shù)組名時(shí),返回整個(gè)數(shù)組所占字節(jié)數(shù);
    int a[10] = { 0 };
    int lena = sizeof a / sizeof a[0];
    std::cout << "lena = " << lena << "\n";

    myData data,*p;
    sizeof(myData);         //存儲(chǔ)myData類型的對(duì)象所占的字節(jié)數(shù)
    sizeof data;            //data變量的類型占據(jù)的空間的字節(jié)數(shù),相當(dāng)于sizeof(myData)
    sizeof p;               //指針p所占空間的字節(jié)數(shù)
    sizeof *p;              //p指向的類型占據(jù)的空間的字節(jié)數(shù),相當(dāng)于sizeof(myData)
    sizeof data.a;          //結(jié)構(gòu)體成員對(duì)應(yīng)類型的大小
    sizeof myData::a;       //另一種獲取結(jié)構(gòu)體成員大小的方法

    std::cout <<
        "sizeof(myData) = " << sizeof(myData) << "\n" <<
        "sizeof data = " << sizeof data << "\n" <<
        "sizeof p = " << sizeof p << "\n" <<
        "sizeof *p = " << sizeof *p << "\n" <<
        "sizeof data.a = " << sizeof data.a << "\n" <<
        "sizeof myData::a = " << sizeof myData::a << "\n";

    char *c;
    std::cout <<
        "sizeof c = " << sizeof c << "\n" <<
        "sizeof *c = " << sizeof *c << "\n";
 }

輸出:

lena = 10
sizeof(myData) = 8
sizeof data = 8
sizeof p = 8
sizeof *p = 8
sizeof data.a = 4
sizeof myData::a = 4
sizeof c = 8
sizeof *c = 1
  • 注1:sizeof * p;
    sizeof 運(yùn)算符滿足右結(jié)合律,而且優(yōu)先級(jí)和*一樣,所以sizeof *p等價(jià)于sizeof(*p),這里sizeof并不會(huì)實(shí)際去求*p的值,所以即使p是一個(gè)空指針也不會(huì)有任何問題。
  • 注2:sizeof a;
    在C++中一般情況下把數(shù)組名視為數(shù)組第一個(gè)元素的地址,一種例外情況是使用 sizeof 操作符作用于數(shù)組名時(shí),返回整個(gè)數(shù)組所占字節(jié)數(shù)。sizeof 作用于指針時(shí),得到的是指針的長度,即使指針指向的是一個(gè)數(shù)組。----<<C++ Primer Plus (中文5th)>>P100,P101

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容