sizeof不是函式,是操作符

2021-05-25 01:35:16 字數 3204 閱讀 2574

用法

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...