sizeof和strlen解析
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) == 1;//sizeof(p)結果為4
在傳遞一個數組名到一個函數中時,它會完全退化為一個指針
?
4.?內存補齊
class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 結果 12 ===》內存補齊
cout<<sizeof(x)<<endl; 結果 12 同上。
內存補齊是一個在筆試面試中比較容易考的知識點?
轉載于:https://blog.51cto.com/liuyuanxing/1926364
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的sizeof和strlen解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基本类型-列表
- 下一篇: Java 流(Stream)、文件(Fi