c 中sizeof的用法

2021-06-20 19:29:52 字數 2447 閱讀 6608

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 型別 物件可以是各種型別的變數,以及...