原型
extern unsigned int strlen(char *s);
在Visual C++6.0中,原型為size_tstrlen(const char *string),其中size_t實際上是unsigned int,在VC6.0中可以看到這樣的代碼:typedef unsigned int size_t。
功能:計算字符串s的(unsigned int型)長度,不包括'0'在内
說明:返回s的長度,不包括結束符NULL。
舉例:
舉例1:(在Visual C++6.0中運行通過)
#include
#include
int main(void)
char*s="GoldenGlobalView";
printf("%shas%dchars",s,strlen(s));
getchar();
return0;
區别sizeof
strlen()函數計算的是字符串的實際長度,遇到第一個'0'結束。如果你隻定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到'0'停止。而sizeof返回的是變量聲明後所占的内存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數。n
⒈sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。
⒉sizeof是取字節運算符(關鍵字),strlen是函數。
⒊sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以'0'結尾的。
⒋數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。
⒌大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的長度。這就是sizeof(x)可以用來定義數組維數的原因。
6.strlen的結果要在運行的時候才能計算出來,是用來計算字符串的長度,不是類型占内存的大小。
7.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數。
⒏當适用了于一個結構類型時或變量,sizeof返回實際的大小,當适用一靜态地空間數組,sizeof歸還全部數組的尺寸。
⒐數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,n
第一個例子
char*ss="0123456789";
sizeof(ss)結果4===》ss是指向字符串常量的字符指針
sizeof(*ss)結果1===》*ss是第一個字符
大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的長度
這就是sizeof(x)可以用來定義數組維數的原因
char str[20]="0123456789";
int a=strlen(str);//a=10;
int b=sizeof(str);//而b=20;
char ss[]="0123456789";
sizeof(ss)結11===》ss是數組,計算到0位置,因此是10+1
sizeof(*ss)結果1===》*ss是第一個字符
char ss[100]="0123456789";
sizeof(ss)結果是100===》ss表示在内存中的大小100×1
strlen(ss)結果是10===》strlen是個函數,内部實現是用一個循環計算到0之前為止
int ss[100]="0123456789";
sizeof(ss)結果400===》ss表示在内存中的大小100×4
strlen(ss)錯誤===》strlen的參數隻能是char*且必須是以'0'結尾的
char q[]="abc";
char p[]="an";
sizeof(q),sizeof(p),strlen(q),strlen(p);
結果是 4 3 3 2
第二個例子
class X{ int i; int j; char k;};X x;
cout<
cout<
第三個例子
char szPath[MAX_PATH]
如果在函數内這樣定義,那麼sizeof(szPath)将會是MAX_PATH,但是将szPath作為虛參聲明時(void fun(char szPath[MAX_PATH])),sizeof(szPath)卻會是4(指針大小)
還有一位網友的說明也很好:
其實理解sizeof隻需要抓住一個要點:
程序存儲分布有三個區域:棧、靜态和動态。能夠從代碼直接操作的對象,包括任何類型的變量、指針,都是在棧上的;動态和靜态存儲區是靠棧上的指針來間接操作的。sizeof操作符,計算的是對象在棧上的投影體積;記住這個就很多東西都很清楚了。
char const * static_string="Hello";
sizeof(static_string) sizeof 一個指針,所以在 32bit system是4
char stack_string[]="Hello";
sizeof(stack_string)是sizeof 一個數組,所以是 6 * sizeof(char)
char * string=new char[6];
strncpy(string,"Hello",6");
sizeof(string)是sizeof一個指針,所以還是4。和第一個不同的是,這個指針指向了動态存儲區而不是靜态存儲區。
不管指針指向的内容在什麼地方,sizeof得到的都是指針的棧大小
C++中對引用的處理比較特殊;sizeof一個引用得到的結果是sizeof一個被引用的對象的大小;所以
struct O{ int a,b,c,d,e,f,g,h;};int main(){ O & r = *new O; cout << sizeof(O) << endl; // 32 cout << sizeof r << endl;//也是32system("PAUSE");}
r引用的是整個的O對象而不是指向O的指針,所以sizeof r的結果和sizeof O完全相同。
strlen()函數計算的是字符串的實際長度,遇到第一個'0'結束。如果你隻定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到'0'停止。而sizeof返回的是變量聲明後所占的内存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數。n



















