1.strlen函數.
#strlen所作的只是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符號 '\0'為止,然後回傳計數器值。
2.sizeof運算子
sizeof()傳回的是變數宣告後所佔的記憶體數,不是實際長度,此外sizeof不是函數,只是一個操作符。
3.strlen和sizeof的差異
3.1 sizeof可以用型別做參數,strlen只能用char*做參數,而且必須是以''\0''結尾的。
3.2 sizeof也可以用函數做參數,例如:short f(); printf("%d\n", sizeof(f()));輸出的結果是sizeof (short),即2。
3.3 陣列做sizeof的參數不退化,傳給strlen就退化成指標了。
3.4 大部分編譯程式在編譯的時候就把sizeof計算過了是類型或是變數的長度這就是sizeof(x)可以用來定義數組維數的原因。
3.5 strlen的結果要在運作的時候才能計算出來,是用來計算字串的長度,而不是型別佔記憶體的大小。
3.6 sizeof後面如果是型別必須加括弧,如果是變數名稱可以不加括弧。這是因為sizeof是個操作符不是個函數。
4.舉例區別strlen與sizeof
##1.char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字串的長度,以結束符0x00 為字串結束。 int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的陣列str[20] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。2.
上面是靜態數組處理的結果,如果是對指針,結果就不一樣了char* ss = "0123456789";
sizeof(ss) 結果4 ===》ss是指向字串常數的字元指針,sizeof 獲得的是一個指針的之所佔的空間,應該是長整型的,所以是4
而sizeof(*ss) 結果1 ===》*ss是第一個字符,其實就是獲得了字符串的第一位'0' 所佔的記憶體空間,是char型別的,佔了1位元strlen(ss)= 10 >>>> 如果要獲得這個字串的長度,則一定要使用strlen。 sizeof函數傳回其參數在記憶體中所佔用的位元組數,而strlen函數傳回參數所指向的字串中字元的個數。3.在使用sizeof時,有一個很特別的情況,就是數組名稱到指標蛻變,char Array[3] = {'0'} ;
sizeof(Array) == 3;char *p = Array;
strlen(p) =#strlen(p) =
#
strlen(p) =#
strlen(p) =# = 1;//sizeof(p)結果為4在傳遞一個陣列名稱到一個函數中時,它會完全退化為一個指標
4. 記憶體補齊
class X
#{
## int i;
int j;
###### char k;############};##################################################################### ###X x;############cout<