sizeof與strlen區別及用法

2021-08-18 12:27:36 字數 1989 閱讀 6041

1.1、你可以把操作符理解為內建的,最基礎的函式,它們無法完全被若干個未使用同型別操作符的函式所替代。比如加法運算子,你就不可能寫出乙個不用+或-的函式來實現任何情況下的加法功能。

1.2、運算子(是操作符的一種)和函式還有乙個重要區別。函式本身有一段**,程式執行時,遇到函式時,會先將函式的引數入棧,再跳到函式的**來執行。而操作符則是在本地直接運算。

1) sizeof( object ); // sizeof( 物件 );

2) sizeof( type_name ); // sizeof( 型別 );

3) sizeof object; // sizeof 物件;

char *str1="absde";

char str2="absde";

char str3[8]=;

char ss = "0123456789";

輸出:sizeof(str1)=4

sizeof(str2)=6;         //sizeof算上\0

sizeof(str3)=8;

sizeof(ss)=11;

首先說明一點,char型別佔乙個位元組,所以sizeof(char)是1,這點要理解

str1是乙個指標,只是指向了字串"absde"而已。所以sizeof(str1)不是字串佔的空間也不是字元陣列佔的空間,而是乙個字元型指標佔的空間。所以sizeof(str1)=sizeof(char*)=4,在c/c++中乙個指標佔4個位元組

str2是乙個字元型陣列。c/c++規定,對於乙個陣列,返回這個陣列佔的總空間,所以sizeof(str2)取得的是字串"absde"佔的總空間。"absde"中,共有a b s d e \0六個字元,所以str2陣列的長度是6,所以sizeof(str2)=6*sizeof(char)=6

str3已經定義成了長度是8的陣列,所以sizeof(str3)為8

str4和str2類似,'0' '1' ... '9'加上'\0'共11個字元,所以ss佔的空間是11

總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於乙個陣列,sizeof返回這個陣列所有元素佔的總空間。

char* str1與char str1容易混淆,一定要分清

寫到這裡,提一問,下面的c3,c4值應該是多少呢

void foo3(char a3[3])       //傳參時,陣列是「傳位址」

int c3 = sizeof( a3 ); // c3 == 4

void foo4(char a4[ ])       //傳參時,形參不需要指定陣列大小,因為陣列是「傳位址」,定義時需要指

int c4 = sizeof( a4 ); // c4 == 4

這裡函式引數a3已不再是陣列型別,而是蛻變成指標,相當於char* a3,為什麼仔細想想就不難明白,我們呼叫函式foo1時,程式會在棧上分配乙個大小為3的陣列嗎不會!陣列是「傳址」的,呼叫者只需將實參的位址傳遞過去,所以a3自然為指標型別(char*),c3的值也就為4。

(1)這裡涉及到乙個重要的知識點——位元組對齊

解釋:為什麼需要位元組對齊?計算機組成原理,因為儲存器硬體構成與計算機指令之間的配合,考慮到為了方便儲存器硬體製造和使指令更精簡兩方面,所以位元組對齊訪問有助於加快計算機的取數速度,否則就得多花指令週期了

為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。

(1)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。

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

char *str1="absde";

strlen(str1) 等於5

char str3[8]=;

strlen(str3) 等於1   因為遇到\0就返回,

sizeof 與 strlen 的區別

一 示例 eg1 下列 char buffer 256 char pbuffer buffer cout sizeof buffer cout sizeof pbuffer 其執行結果為 eg2 簡單說明 sizeof gives the amount of storage,in bytes,ass...

strlen與sizeof的區別

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

sizeof與strlen的區別

sizeof 表示式 是c c 關鍵字 不是函式 功能 返回 表示式 結果所佔機器 位元組 的大小。strlen 字串 是c c 標準庫的函式 不是關鍵字 在標頭檔案 string.h 中宣告。功能 計算 字串 中的 0 之前的字元個數。特別注意 strlen總是假定傳給它的引數是以null結束符 ...