用法
sizeof(型別說明符,陣列名或表示式); 或
sizeof 變數名
sizeof是c/c++中的乙個操作符(operator)是也,簡單的說其作用就是返回乙個物件或者型別所佔的記憶體位元組數。
msdn上的解釋為:
the sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). this keyword returns a value of type size_t.
其返回值型別為size_t,在標頭檔案stddef.h中定義。這是乙個依賴於編譯系統的值,一般定義為
typedef unsigned int size_t;
世上編譯器林林總總,但作為乙個規範,它們都會保證char、signed char和unsigned
char的sizeof值為1,畢竟char是我們程式設計能用的最小資料型別。
sizeof有三種語法形式,如下:
1) sizeof( object ); // sizeof( 物件 );
2) sizeof( type_name ); // sizeof( 型別 );
3) sizeof object; // sizeof 物件;
所以,int i;
sizeof( i ); // ok
sizeof i; // ok
sizeof( int ); // ok
sizeof int; // error
既然寫法3可以用寫法1代替,為求形式統一以及減少我們大腦的負擔,第3種寫法,忘掉它吧!實際上,sizeof計算物件的大小也是轉換成對物件型別的 計算,也就是說,同種型別的不同物件其sizeof值都是一致的。這裡,物件可以進一步延伸至表示式,即sizeof可以對乙個表示式求值,編譯器根據表 達式的最終結果型別來確定大小,一般不會對表示式進行計算。如:
sizeof( 2 ); // 2的型別為int,所以等價於 sizeof( int );
sizeof( 2 +
3.14 ); // 3.14的型別為double,2也會被提公升成double型別,所以等價於 sizeof( double );
sizeof也可以對乙個函式呼叫求值,其結果是函式返回型別的大小,函式並不會被呼叫,我們來看乙個完整的例子:
char foo()
int main()
c99標準規定,函式、不能確定型別的表示式以及位域(bit-field)成員不能被計算sizeof值,即下面這些寫法都是錯誤的:
sizeof( foo );// error
void foo2()
sizeof( foo2() );// error
struct s ;
sizeof( s.f1 );// error
3. sizeof的常量性
sizeof的計算發生在編譯時刻,所以它可以被當作常量表示式使用,如:
char ary[ sizeof( int ) * 10 ]; // ok
最新的c99標準規定sizeof也可以在執行時刻進行計算,如下面的程式在dev-c++中可以正確執行:
int n;
n = 10; // n動態賦值
char ary[n]; // c99也支援陣列的動態定義
printf("%d/n", sizeof(ary)); // ok. 輸出10
但在沒有完全實現c99標準的編譯器中就行不通了,上面的**在vc6中就通不過編譯。所以我們最好還是認為sizeof是在編譯期執行的,這樣不會帶來錯誤,讓程式的可移植性強些。
4. 基本資料型別的sizeof
這裡的基本資料型別指short、int、long、float、double這樣的簡單內建資料型別,由於它們都是和系統相關的,所以在不同的系統下取值可能不同,這務必引起我們的注意,盡量不要在這方面給自己程式的移植造成麻煩。
一般的,在32位編譯環境中,sizeof(int)的取值為4。
5. 指標 變數的sizeof
學過資料結構的你應該知道指標是乙個很重要的概念,它記錄了另乙個物件的位址。既然是來存放位址的,那麼它當然等於計算機內部位址匯流排的寬度。所以在32位計算機中,乙個指標變數的返回值必定是4(注意結果是以位元組為單位),可以預計,在將來的
64位 系統中指標變數的sizeof結果為8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();// 函式指標
sizeof( pc ); // 結果為4
sizeof( pi ); // 結果為4
sizeof( ps ); // 結果為4
sizeof( ppc ); // 結果為4
sizeof( pf );// 結果為4
指標變數的sizeof值與指標所指的物件沒有任何關係,正是由於所有的指標變數所佔記憶體大小相等,所以mfc訊息處理函式使用兩個引數wparam、lparam就能傳遞各種複雜的訊息結構(使用指向結構體的指標)。
6. 陣列的sizeof
陣列的sizeof值等於陣列所占用的記憶體位元組數,如:
char a1 = "abc";
int a2[3];
sizeof( a1 ); // 結果為4,字元 末尾還存在乙個null終止符
sizeof( a2 ); // 結果為3*4=12(依賴於int)
一些朋友剛開始時把sizeof當作了求陣列元素的個數,現在,你應該知道這是不對的,那麼應該怎麼求陣列元素的個數呢easy,通常有下面兩種寫法:
int c1 = sizeof( a1 ) / sizeof( int ); // 總長度/單個元素的長度
int c2 = sizeof( a1 ) / sizeof( a1[0] ); // 總長度/第乙個元素的長度
寫到這裡,提一問,下面的c3,c4值應該是多少呢
void foo3(char a3[3])
void foo4(char a4)
也許當你試圖回答c4的值時已經意識到c3答錯了,是的,c3!=3。這裡函式引數a3已不再是陣列型別,而是蛻變成指標,相當於char* a3,為什麼仔細想想就不難明白,我們呼叫函式foo1時,程式會在棧上分配乙個大小為3的陣列嗎不會!陣列是「傳址」的,呼叫者只需將實參的位址傳遞過 去,所以a3自然為指標型別(char*),c3的值也就為4。
詳解sizeof操作符
一 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用形式 sizeof ...
sizeof操作符詳解
論及測試基礎是windows 32位平台,vs2008開發工具 測試基本型別 1.基本規則 sizeof 操作符的作用是返回乙個物件或型別名所佔的記憶體位元組數,返回值的型別為size t,長度的單位是位元組,在編譯而不是執行時確定。對引用型別做sizeof操作將返回存放此引用型別物件所需的內在空間...
go 不是操作符
在go中,並不像在c中作為操作符,而是作為語句出現。下面是乙個關於print的範例 package main import fmt varnum int 0 func main fmt.println num 1 func subself int func addself int 在c中,print...