簡介:
今天在讀《c專家編程》的時候看到第38頁里面說到“當(dāng)sizeof的操作數(shù)是類型名時,兩邊必須加上括號(這常使人們誤以為sizeof是個函數(shù)),但操作數(shù)如果是變量則不必加括號”统扳。巧了矗愧,我之前一直以為sizeof是函數(shù)......,這里查查手冊記錄一下峻贮。
1. sizeof 運(yùn)算符
sizeof 返回一個表達(dá)式或者一個類型名所占的字節(jié)數(shù),使用語法有兩種:
(1) sizeof( type ); //返回type類型所占的字節(jié)數(shù)
(2) sizeof expression; //返回expression結(jié)果類型的大行笃铡(并不計(jì)算表達(dá)式實(shí)際的值)
注:根據(jù)計(jì)算架構(gòu)不同一個字節(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ù)組第一個元素的地址
//例外情況是使用 sizeof 操作符作用于數(shù)組名時吃挑,返回整個數(shù)組所占字節(jié)數(shù);
int a[10] = { 0 };
int lena = sizeof a / sizeof a[0];
std::cout << "lena = " << lena << "\n";
myData data,*p;
sizeof(myData); //存儲myData類型的對象所占的字節(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)體成員對應(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)先級和*一樣,所以sizeof *p等價(jià)于sizeof(*p),這里sizeof并不會實(shí)際去求*p的值赎离,所以即使p是一個空指針也不會有任何問題逛犹。 - 注2:sizeof a;
在C++中一般情況下把數(shù)組名視為數(shù)組第一個元素的地址,一種例外情況是使用 sizeof 操作符作用于數(shù)組名時梁剔,返回整個數(shù)組所占字節(jié)數(shù)虽画。sizeof 作用于指針時,得到的是指針的長度荣病,即使指針指向的是一個數(shù)組码撰。----<<C++ Primer Plus (中文5th)>>P100,P101
參考
- https://en.cppreference.com/w/cpp/language/sizeof
- <<C++ Primer Plus>>
- <<C++ Primer>>