在c/c++中,sizeof是乙個判斷資料型別或者表示式長度的運算子。其作用好像類似於strlen()函式,但是兩者還是有所不同。
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.sizeof是c/c++中的乙個操作符(operator),簡單的說其作用就是返回乙個物件或者型別所佔的記憶體位元組數。其返回值型別為size_t,在標頭檔案stddef.h中定義。這是乙個依賴於編譯系統的值,一般定義為————引自msdn
typedef unsigned int size_t;
sizeof引數可以是陣列、指標、型別、物件、函式等。 具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:
陣列——編譯時分配的陣列空間大小;
指標——儲存該指標所用的空間大小;
型別——該型別所佔的空間大小;
物件——物件的實際占用空間大小;
函式——函式的返回型別所佔的空間大小(函式的返回型別不能是void)。
需要注意的是,基本資料型別的sizeof,這裡的基本資料型別指short、int、long、float、double這樣的簡單內建資料型別,由於它們都是和系統相關的,所以在不同的系統下取值可能不同,這務必引起我們的注意,盡量不要在這方面給自己程式的移植造成麻煩。一般的,在32位編譯環境中,sizeof(int)的取值為4。
總體而言,在語法上,sizeof可分為兩種:
sizeof(type_name);//sizeof(型別);
sizeof object;//sizeof物件;
但是,sizeof計算物件的大小也是轉換成對物件型別的計算,也就是說,同種型別的不同物件其sizeof值都是一致的。
而當sizeof對乙個表示式求值,編譯器根據表示式的最終結果型別來確定大小,一般不會對表示式進行計算。
sizeof也可以對乙個函式呼叫求值,其結果是函式返回型別的大小,函式並不會被呼叫。
sizeof的計算發生在編譯時刻,所以它可以被當作常量表示式使用。
其實理解 sizeof 只需要抓住乙個要點:棧
程式儲存分布有三個區域:棧、靜態和動態。能夠從**直接操作的物件,包括任何型別的變數、指標,都是在棧上的;動態和靜態儲存區是靠棧上的所有指標間接操作的。 sizeof 操作符,計算的是物件在棧上的投影體積;記住這個就很多東西都很清楚了。
char const* str="hello";
//sizeof(str)是sizeof乙個指標,所以在32位系統下是4
char stack_str="hello";
//sizeof(stack_str)是sizeof乙個陣列,所以是6*sizeof(char)
char* string=new_char[6];
strncpy(string, "hello", 6);
//sizeof(string)是sizeof乙個指標,所以還是4。
對於指標的sizeof操作,可以詳見我之前的文章:指標解析
對於結構的sizeof操作,可以詳見我之前的文章:簡析結構體儲存分配
strlen是c/c++中的函式,其用來獲取字串的長度。
從上面的我們不難看出strlen引數必須是字元型指標(char*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。strlen要在執行時才能計算。
1、原理
strlen(char*)函式求的是字串的實際長度,直到遇到第乙個』\0』,然後就返回計數值,且不包括』\0』。
char arr1[10];
cout而sizeof()函式返回的是變數宣告後所佔的記憶體數,不是實際長度。
char arr1[10];
cout<2、本質
sizeof是乙個取位元組運算子(操作符operator),而strlen是乙個函式。
3、引數
sizeof引數比較廣泛,可以用型別做引數,還可以用函式做引數。如:
int sum();
printf("%d\n",sizeof(sum()));//輸出的結果是sizeof(int),即4。
strlen只能用char*做引數,且必須是以』』\0』'結尾的。
4、執行
大部分編譯程式在編譯的時候就把sizeof計算過了是型別或是變數的長度。這就是sizeof(x)可以用來定義陣列維數的原因。
strlen的結果要在執行的時候才能計算出來,是用來計算字串的長度,不是型別佔記憶體的大小。
5、sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。
該型別保證能容納實現所建立的最大物件的位元組大小
6、sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。
7、當陣列做sizeof的引數不退化,而傳遞給strlen就退化為指標了。
這是因為陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址。在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小
關於C語言sizeof運算子和strlen 函式
c primer plus總結 1.不同點 sizeof運算子是以位元組為單位返回運算子物件的大小 strlen 函式給出字串中的字元長度 2.相同點 sizeof運算子和strlen 函式返回型別可以用 zd轉換 不識別 zd,嘗試換成 u或者 lu sizeof運算子和strlen 函式返回的實...
sizeof用法總結
在vc中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof後面的 引數對sizeof的用法做個總結。a 引數為資料型別或者為一般變數。例如sizeof int sizeof long 等等。這種情 況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在...
sizeof 用法總結
sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的一種。所有指標變數的siz...