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結束符 ...