sizeof是乙個操作符(operator)。其作用是返回乙個物件或型別所佔的記憶體位元組數。
sizeof有三種語法形式:
sizeof (object)
; //sizeof (物件)
sizeof object; //sizeof 物件
sizeof (type_name)
; //sizeof (型別)
物件可以是各種型別的變數,以及表示式(一般sizeof不會對表示式進行計算)。
sizeof對物件求記憶體大小,最終都是轉換為對物件的資料型別進行求值。
sizeof (表示式); //值為表示式的最終結果的資料型別的大小
舉例:
int i;
sizeof
(int);
//值為4
sizeof
(i);
//值為4,等價於sizeof(int)
sizeof i;
//值為4
sizeof(2
);//值為4,等價於sizeof(int),因為2的型別為int
sizeof(2
+3.14);
//值為8,等價於sizeof(double),因為此表示式的結果的型別為double
char ary[
sizeof
(int)*
10];//ok,編譯無誤
基本資料型別的sizeof這裡的基本資料型別是指short、int、long、float、double這樣的簡單內建資料型別。
由於它們的記憶體大小是和系統相關的,所以在不同的系統下取值可能不同。
結構體的sizeof結構體的sizeof涉及到位元組對齊問題。
為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。
位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則:
例子:
struct s1
;sizeof
(s1)
;//值為8,位元組對齊,在char之後會填充3個位元組。
struct s2
;sizeof
(s2)
;//值為8,位元組對齊,在char之後會填充3個位元組。
struct s3
;sizeof
(s3)
;//值為1,空結構體也佔記憶體
聯合體的sizeof結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共享一段記憶體;所以整個聯合體的sizeof也就是每個成員sizeof的最大值。
例子:
union u
;sizeof
(u);
//值為8
陣列的sizeof陣列的sizeof值等於陣列所占用的記憶體位元組數。
注意:1)當字元陣列表示字串時,其sizeof值將』/0』計算進去。
2)當陣列為形參時,其sizeof值相當於指標的sizeof值。
例子1:
char a[10]
;char n=
"abc"
;
cout<<
"char a[10] "
<<
sizeof
(a)/陣列,值為10
cout<<
"char n = /"abc/
" "
<<
sizeof
(n)/字串陣列,將'/0'計算進去,值為4
例子2:
void
func
(char a[3]
)void
funcn
(char b)
指標的sizeof指標是用來記錄另乙個物件的位址,所以指標的記憶體大小當然就等於計算機內部位址匯流排的寬度。
在32位計算機中,乙個指標變數的返回值必定是4。
指標變數的sizeof值與指標所指的物件沒有任何關係。
例子:
char
*b =
"helloworld"
;char
*c[10];
double
*d;int
**e;
void
(*pf)()
;
cout<<
"char *b = /"helloworld/
" "
<<
sizeof
(b)/指標指向字串,值為4
cout<<
"char *b "
<<
sizeof
(*b)
/指標指向字元,值為1
cout<<
"double *d "
<<
sizeof
(d)/指標,值為4
cout<<
"double *d "
<<
sizeof
(*d)
/指標指向浮點數,值為8
cout<<
"int **e "
<<
sizeof
(e)/指標指向指標,值為4
cout<<
"char *c[10] "
<<
sizeof
(c)/指標陣列,值為40
cout<<
"void (*pf)(); "
<<
sizeof
(pf)
/函式指標,值為4
函式的sizeofsizeof也可對乙個函式呼叫求值,其結果是函式返回值型別的大小,函式並不會被呼叫。
對函式求值的形式:sizeof(函式名(實參表))
注意:不可以對返回值型別為空的函式求值。
不可以對函式名求值。
對有引數的函式,在用sizeof時,須寫上實參表。
例子:
#include
using
namespace std;
float
funcp
(int a,
float b)
intfuncnp()
void
func()
intmain()
c 中sizeof的用法
1 作用 sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2 sizeof有三種用法形式,sizeof操作符,對變數或物件可以不加括號,但若是型別,須加括號 如下 1 sizeof object 物件 2 sizeof type name 型別 3 sizeof...
C中sizeof的用法
之前學習c語言,對於其中的很多細節問題都沒有了解的很清楚,都囫圇吞棗的過去了,每次看到各個公司出的筆試面試題的時候,才發現自己的c語言基礎中漏洞百出,今天就其中的乙個漏洞 sizeof好好的彌補一下,如有不當,敬請指出。sizeof,計算資料空間的大小,它不是函式,而是一種單目運算子。sizeof,...
C中sizeof的用法
sizeof用法總結 1 在c語言中,sizeof 是乙個判斷資料型別或者表示式長度的運算子,對 sizeof 的處理都是在編譯階段進行。2 基本資料型別的sizeof 這裡的基本資料型別指short int long float double這樣的簡單內建資料型別,由於它們都是和系統相關的,所以在...