sizeof用法大總結(上)

2021-07-05 14:52:36 字數 2550 閱讀 8163

說明:本文所以程式都是基於32位系統,編譯器為vs2010

首先需要明確的是sizeof是乙個運算子,並不是乙個函式,其次sizeof計算的是棧中物件所佔的記憶體大小,所以對於全域性變數和靜態變數,sizeof就無法計算其所佔記憶體大小。

對於c/c++語言中各基本型別,結果如下:

cout<

對於sizeof(void),void是不完整的型別,而sizeof不允許使用不完整型別,所以出錯。

int a;

cout<

上面前2條語句都是合法的,第3條是非法的,因為對於sizeof運算子來說,變數可以不用括號,但是對於型別名稱,則必須要用括號。所以使用括號將會確保萬無一失。

對於32位系統來說,指標始終佔4個位元組的儲存空間(64位系統中,指標佔8個位元組),所以,不管是什麼型別的指標變數,利用sizeof求得的結果都是4(只針對32位系統,其他位數系統可參考如下**)。

8位系統

指標佔1位元組

16位系統

指標佔2位元組

32位系統

指標佔4位元組

64位系統

指標佔8位元組

char *b1;

int *b2;

double *b3;

cout<

int a[5];

double *b[5];

double **c[5];

int (*e)[5];

int *(*f)[5];

cout<

解釋1:a是乙個含5個int型元素的一維陣列,由於int型佔4位元組,所以大小為sizeof(int)*5= 4*5

解釋2:b是乙個含5個int*型元素的一維指標陣列(一級指標),由於指標佔4位元組,所以大小為sizeof(int*)*5 = 4*5(如果改寫為double* b[5]可能更好理解,兩者寫法都是一樣的)。

解釋3:c是乙個含5個int**型元素的一維指標陣列(二級指標),由於指標佔4位元組,所以大小為sizeof(int)*5 = 4*5(如果改寫為double** c[5]可能更好理解,兩者寫法都是一樣的)。

解釋4:e是乙個陣列指標,指向乙個含5個int型元素的一維陣列,所以sizeof(e)等價於指標所佔的位元組數,所以大小為4

解釋5:f是乙個陣列指標,指向乙個含5個int*型元素的一維陣列,所以sizeof(f)等價於指標所佔的位元組數,所以大小為4(如果改寫為int* (*f)[5]可能更好理解,兩者寫法都是一樣的)。

int aa[2][5];

double *bb[2][5];

double **cc[2][5];

int (*ee)[2][5];

int *(*ff)[2][5];

cout<

解釋6:aa是乙個2*5的二維陣列,陣列中每個元素為int型,由於int型佔4位元組,所以大小為sizeof(int)*2*5 = 4*2*5

解釋7:bb是乙個含5個int*型元素的二維指標陣列(一級指標),由於指標佔4位元組,所以大小為sizeof(int*)*2*5 = 4*2*5(如果改寫為double* bb[2][5]可能更好理解,兩者寫法都是一樣的)。

解釋8:cc是乙個含2*5個int**型元素的二維指標陣列(二級指標),由於指標佔4位元組,所以大小為sizeof(int)*2*5 = 4*2*5(如果改寫為double** cc[2][5]可能更好理解,兩者寫法都是一樣的)。

解釋9:ee是乙個陣列指標,指向乙個含2*5個int型元素的二維陣列,所以sizeof(ee)等價於指標所佔的位元組數,所以大小為4

解釋10:ff是乙個陣列指標,指向乙個含2*5個int*型元素的二維陣列,所以sizeof(ff)等價於指標所佔的位元組數,所以大小為4(如果改寫為int* (*ff)[2][5]可能更好理解,兩者寫法都是一樣的)。

先看乙個例子程式:

int i = 3;

int j;

j = sizeof(++i + ++i);

printf("i=%d j=%d\n", i, j);

printf輸出結果為i=3 j=4

從這個示例程式中,我們可以看到當sizeof中含有表示式的時候,那麼表示式是不會做計算的,也就是不管加加減減,sizeof只是針對表示式中的變數計算大小。

char m;

int n;

double dn;

cout<

解釋1:由於m是char,n是int,所以進行加法運算的時候,會將char型提公升為int型,所以sizeof輸出為4(但是不會計算m+n的結果值)。

解釋2:不會進行型別提公升,因為都是int型,所以輸出4。

解釋3:參考解釋1。

解釋4:參考解釋2。

解釋5:參考解釋1。

解釋6:參考解釋2。

解釋7:由於m是char,2是int,所以進行乘法法運算的時候,會將char型提公升為int型,所以sizeof輸出為4。

當用sizeof計算函式所佔的記憶體空間的時候,輸出結果等價於sizeof(函式返回值型別)。

double fun(double a, double b)

double da,db;

cout<

sizeof用法總結

在vc中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof後面的 引數對sizeof的用法做個總結。a 引數為資料型別或者為一般變數。例如sizeof int sizeof long 等等。這種情 況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在...

sizeof 用法總結

sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的一種。所有指標變數的siz...

sizeof用法總結

sizeof用法總結 以下執行環境都是一般的,在32位編譯環境中 1,基本資料型別的sizeof cout 再看示例 pragma pack push 將當前pack設定壓棧儲存 pragma pack 2 必須在結構體定義之前使用 struct s1 struct s3 pragma pack p...