1) 作用:sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示。
2) sizeof有三種用法形式,(sizeof操作符,對變數或物件可以不加括號,但若是型別,須加括號),如下:
1) sizeof( object ); // 物件
2) sizeof( type_name ); // 型別
3) sizeof object; // 物件
3)基本資料型別
sizeof int : 4
sizeof short : 2
sizeof long : 4
sizeof float : 4
sizeof double : 8
sizeof char : 1
sizeof p : 4
sizeof word : 2
sizeof dword : 4
注意:定義乙個空的型別,裡面沒有任何成員變數和成員函式,若對該型別求sizeof,那麼其結果對於是有編譯器決定的,對於vs,每個空型別的例項占用1位元組的空間。之所以空型別不包含任何資訊還要占用記憶體,是因為在宣告該型別的例項的時候,它必須要在記憶體中占有一定的空間,以便後續需要使用這些例項。
4) 指標型別:指標記錄了另乙個物件的位址。既然是來存放位址的,那麼它當然等於計算機內部位址匯流排的寬度。所以在32位計算機中,乙個指標變數的返回值必定是4(注意結果是以位元組為單位),在64位系統中指標變數的sizeof結果為8。指標變數的sizeof值與指標所指的物件沒有任何關係,因為指標是存放位址的,所有的指標變數所佔記憶體大小相等。
ex: int *p; sizeof(p)=4; 但sizeof(*p)相當於sizeof(int);
char** ppc = &pc; void (*pf)();// 函式指標
陣列做型參時,陣列名稱當作指標使用!! void fun(char p) sizeof(p)等於4
5)陣列:陣列的sizeof值等於陣列所占用的記憶體位元組數。陣列元素個數×陣列元素型別所佔記憶體位元組數,對於char型別的,是要包括'\0'結束符的。
經典問題:
ex: int *p; sizeof(p)=4; 但sizeof(*p)相當於sizeof(int);
char** ppc = &pc; void (*pf)();// 函式指標
陣列做型參時,陣列名稱當作指標使用!! void fun(char p) sizeof(p)等於4
問題解析:
a表示乙個指向
double*[3][6]
型別陣列的指標。既然是指標,所以
sizeof(a)就是4
。 既然
a是執行
double*[3][6]
型別的指標,
*a就表示乙個
double*[3][6]
的多維陣列型別,因此
sizeof(*a)=3*6*sizeof(double*)=72
。同樣的,
**a表示乙個
double*[6]
型別的陣列,所以
sizeof(**a)=6*sizeof (double*)=24
。***a
就表示其中的乙個元素,也就是
double*
了,所以
sizeof(***a)=4
。至於****a
,就是乙個
double
了,所以
sizeof(****a)=sizeof(double)=8
。6)struct
總體上遵循兩個原則:
(1)整體空間是
占用空間最大的成員(的型別)所佔位元組數的整倍數
(2)資料對齊原則---記憶體按結構成員的先後順序排列,當排到該成員變數時,其前面已擺放的空間大小必須是該成員型別大小 的整倍數,如果不夠則補齊,以此向後類推。。。。。
struct s1
; cout大小雖然都是
8,但是
s1的對齊方式是1,
s2是8(
double
),所以在s3和
s4中才有這樣的差異。
所以,在自己定義結構體的時候,如果空間緊張的話,最好考慮對齊因素來排列結構體裡的元素。
7)聯合體
結構體在記憶體組織上是順序式的,聯合體則是重疊式,各成員共享一段記憶體,所以整個聯合體的sizeof也就是每個成員sizeof的最大值。結構體的成員也可以是復合型別,這裡,復合型別成員是被作為整體考慮的。
所以,下面例子中,u的sizeof值等於sizeof(s)。
union u
;
另外參考:
C中sizeof的用法
之前學習c語言,對於其中的很多細節問題都沒有了解的很清楚,都囫圇吞棗的過去了,每次看到各個公司出的筆試面試題的時候,才發現自己的c語言基礎中漏洞百出,今天就其中的乙個漏洞 sizeof好好的彌補一下,如有不當,敬請指出。sizeof,計算資料空間的大小,它不是函式,而是一種單目運算子。sizeof,...
C中sizeof的用法
sizeof用法總結 1 在c語言中,sizeof 是乙個判斷資料型別或者表示式長度的運算子,對 sizeof 的處理都是在編譯階段進行。2 基本資料型別的sizeof 這裡的基本資料型別指short int long float double這樣的簡單內建資料型別,由於它們都是和系統相關的,所以在...
C 中sizeof的用法
sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。sizeof有三種語法形式 sizeof object sizeof 物件 sizeof object sizeof 物件 sizeof type name sizeof 型別 物件可以是各種型別的變數,以及...