對於sizeof 和strlen 的深入理解

2021-08-04 17:39:46 字數 1454 閱讀 8679

今天在看《程式設計師面試寶典》時,發現書中對sizeof()和strlen()兩個函式有著較為深刻的理解,特地分享給大家。

1.sizeof操作符的結果型別是size_t,它在標頭檔案中的typedef為unsigned int 型別。該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof是運算子,strlen是函式

3.sizeof可以用型別做引數,strlen只能用 char *做引數,且必須是以'\0'結尾的。sizeof還可以用函式做引數,比如:

short f();

printf("%d\n",sizeof(f()));

輸出的結果是sizeof(short),即2.

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標

5.大部分編譯程式在編譯的時候就把sizeof計算過了,是型別或是變數的長度。這就是sizeof(x)可以用來定義陣列維數的原因:

char str[20]="0123456789";

int a=strlen(str);

int b=sizeof(str);

6.strlen的結果要在執行的時候才能計算出來,用來計算字串的長度,而不是型別佔記憶體的大小。

7.sizeof後如果是型別必須加括號,如果是變數名可以不加括號。這是因為sizeof是個操作符而不是個函式。

8.當使用了乙個結構型別或變數時,sizeof()返回實際的大小。當使用一靜態的空間陣列時,sizeof返回全部陣列的尺寸。sizeof操作符不能返回被動態分配的陣列或外部的陣列的尺寸。

9.陣列作為引數傳給函式時,傳遞的是指標而不是陣列,傳遞的是數值的首位址,如fun(char [8]),fun(char )都等價於 fun(char *)。在c++裡傳遞陣列永遠都是傳遞指向數值的首元素的指標,編譯器不知道陣列的大小。如果想在函式內知道陣列的大小,需要這樣做:進入函式後用memcpy將陣列複製出來,長度由另外乙個形參傳進去,**如下:

fun(unsigned char *p1,int len)

10.計算結構變數的大小就必須討論資料對齊的問題。為了使cpu訪問的速度最快,c++在處理資料時經常把結構變數中的成員大小按照4或8的倍數計算,這就叫做資料對齊。這樣做可能會浪費一些記憶體,但是理論上cpu速度快了。當然,這樣的設定會在讀寫一些別的應用生產的資料檔案或者交換資料時帶來不便。ms vc++中的對齊設定,有時候sizeof()得到的與實際不等。一般在vc++中加上#pragma pack(n)的設定即可。或者如果要按位元組儲存,而不進行資料對齊,可以在options對話方塊中修改advanced compiler 選項卡中的"data alignment」為按位元組對齊。

11.sizeof操作符不能用於函式型別,不完全型別或位字段。不完全型別指具有未知儲存大小資料的資料型別,如未知儲存大小的陣列型別,未知內容的結構或聯合型別,void型別等。

sizeof和strlen和 countof的區別

運算子,計算引數所佔記憶體 int nnum2 strlen arr 是函式,求字元的個數,不包括 0 int nnum3 countof arr windows巨集 計算陣列的元素個數 cout nnum1 cout nnum2 cout nnum3 endl int arr1 20 nnum1 ...

sizeof和strlen的區別

sizeof與strlen的區別與聯絡 轉 1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用c...

strlen和sizeof的區別

sizeof與strlen的區別與聯絡 轉 1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用c...