標籤:是的 數組名 必須 字串 位元組 基本資料 運算式 ber 開始
1.知識點
(1)sizeof是一個單目運算髮,而不是一個函數,其用於擷取運算元所佔記憶體空間的位元組數。
(2)sizeof的運算元可以使類型名,也可以是運算式,如果是類型名則直接獲得該類型所佔位元組數,如果是運算式,則先分析運算式結果的類型,再根據類型確定所佔位元組數,並不對錶達式進行實際計算。
1 int a = 1;2 double b = 1.5;3 sizeof(int);//結果為44 sizeof(a); //結果為45 sizeof(b); //結果為8
(3)sizeof很少單獨使用,而是和記憶體配置或者計演算法數組長度等需求進行配合使用。
1 //與記憶體空間分配配合使用2 int *ptr = (int *)malloc(sizeof(int) * 20);3 //與計算數組長度配合使用4 int count = sizeof(darray) / sizeof(double);
(4)數組名作為運算元時,將獲得整個數組所佔空間,當數組名作為實參傳遞給子函數時,此時數組名已經成為了指標,其計算結果將是指標的所佔空間。
void subfunc(double darray[]) { cout << sizeof(darray) / sizeof(double) << endl; //輸出4/8=0}int main(int argc, char *argv[]) { double darray[20]; cout << sizeof(darray) / sizeof(double) << endl; //輸出16/8=20 subfunc(darray); getchar(); return 0;}
(5)在計算字串長度時要用strlen。sizeof是一個運算子,用於擷取類型或運算式的所佔記憶體大小;strlen是一個函數,用於計算字串中字元的個數,其中字串結尾符\0不會被計算在內。
2.面試題2.1不能使用sizeof計算的運算式
1 struct baby 2 { 3 unsigned int gender : 1; 4 unsigned int weight : 5; 5 unsigned int week : 7; 6 unsigned int blood : 3; 7 unsigned int height : 8; 8 }; 9 int triple(int number) {10 return 3 * number;11 }12 int main(int argc, char *argv[]) {13 sizeof(baby); //A14 sizeof(baby.gender);//B15 sizeof(triple);//C16 sizeof(triple(3));//D17 sizeof(show());//E18 19 getchar();20 return 0;21 }
答案:正確:A,D;錯誤:B,C,E.
(1)sizeof計算結構體是結果是結構體的所佔記憶體空間,結構體中使用了位域定義成員,要求一個位域成員不能橫跨兩個位元組,故可以算出該結構體的位元組數為4,A正確。
(2)sizeof計算的結果是位元組數,但是不允許計算結構體中某個位域成員的所佔空間,當然如果不是位域定義的是可以計算的。故B錯。
(3)不允許計算函數名的所佔位元組數大小,有點莫名其妙,C錯。
(4)允許計算表達函數運算式,其結果是函數傳回值的類型的位元組數,即該題的int大小,D正確。
(5)函數傳回值類型不確定使,不允許通過sizeof計算,故E錯誤。
2.2sizeof計算結構體是的記憶體對其問題
寫出下面兩個結構體的sizeof計算結果
struct s1{ char a;//1 short b;//4 int c;//8 double d;//16,16剛好是double大小的整數倍};struct s2 { char a;//1 short b;//4 double c;//16(從9開始排) int d;//20(該結果不是double的整數倍,故需要加到24)};
資料對其總結:(1)每個成員在記憶體中的起始位置都必須是自身大小的整數倍。
(2)最終結構體計算結果必須是占位元組數最大的成員的整數倍。
答案:16,24。
2.3結構體嵌套時的sizeof計算
1 struct s1 { 2 int a; 3 }; 4 struct s2 { 5 char a[4]; 6 }; 7 struct s3{ 8 char a[4]; 9 char b;10 };11 struct s4 {12 s1 a;13 char b;14 };15 struct s5{16 s2 a;17 char b;18 };
含複雜結構體的資料對其總結:在資料對其時,要以結構體中最深層的基礎資料型別 (Elementary Data Type)為準。例如:如果結構體成員是一個數組,應以數組的元素的類型作為資料對其的標準,如果結構體成員是其他結構體,應以內層結構體中的基本元素類型成員作為外層結構體資料對齊的標準。故答案如下
1 sizeof(struct s1)=4;2 sizeof(struct s2)=4;3 sizeof(struct s3)=5;4 sizeof(struct s4)=8;5 sizeof(struct s5)=5;
C++程式設計基礎(5)sizeof的使用