sizeof 和 strlen 有如下區別:
sizeof 是一個操做符,strlen 是庫函數。
sizeof 的參數能夠是數據的類型,也能夠是變量,而 strlen 只能以結尾爲‘\ 0‘的字符串做參數。
編譯器在編譯時就計算出了 sizeof 的結果。而 strlen 函數必須在運行時才能計算出來。而且 sizeof
計算的是數據類型佔內存的大小,而 strlen 計算的是字符串實際的長度。
數組作 sizeof 的參數不退化,傳遞給 strlen 就退化爲指針了。數組
int _tmain(int argc, _TCHAR* argv[])
{
函數
//strlen(char*)函數求的是字符串的實際長度,它求得方法是從開始到遇到第一個'\0',
// 若是你只定義沒有給它賦初值,這個結果是不定的
// 它會從aa首地址一直找下去,直到遇到'\0'中止ui
//而sizeof()返回的是變量聲明後所佔的內存數,不是實際長度,
//此外sizeof不是函數,僅僅是一個操做符,strlen是函數。
char aa[10];
std::cout << strlen(aa) << endl; //結果是不定的
spa
char bb[10]={'\0'};
std::cout << strlen(bb) << endl; //結果爲0
指針
char cc[10] = "hui";
std::cout << strlen(cc) << endl; //結果爲3
內存
char *s="Golden Global View";
std::cout << strlen(s) << endl; // 18
ci
std::cout << sizeof(aa) << endl; // 10
std::cout << sizeof(bb) << endl; // 10
std::cout << sizeof(cc) << endl; // 10
std::cout << sizeof(s) << endl; // 4字符串
//大部分編譯程序 在編譯的時候就把sizeof計算過了 是類型或是變量的長度 這就是sizeof(x)能夠用來定義數組維數的緣由
char* ee = "0123456789";
std::cout << sizeof(ee) << endl; //結果 4 ===》ee是指向字符串常量的字符指針
std::cout << sizeof(*ee) << endl; //結果 1 ===》*ee是第一個字符
get
char str[20]="0123456789";
std::cout << strlen(str) << endl; //10
std::cout << sizeof(str) << endl; //20
編譯器
char ff[] = "0123456789";
std::cout << sizeof(ff) << endl; //結果 11 ===》ff是數組,計算到\0位置,所以是10+1
std::cout << sizeof(*ff) << endl; //結果 1 ===》*ff是第一個字符
char gg[100] = "0123456789";
std::cout << sizeof(gg) << endl; //結果是100 ===》gg表示在內存中的大小 100×1
std::cout << strlen(gg) << endl; //結果是10 ===》strlen是個函數,內部實現是用一個循環計算到\0以前爲止
int hh[100] = {0,1,2,3,4,5,6,7,8,9};
std::cout << sizeof(hh) << endl; //結果 400 ===》hh表示在內存中的大小 100×4
//std::cout << strlen(hh) << endl; //錯誤 ===》strlen的參數只能是char* 且必須是以'\0'結尾的
char q[]="abc";
char p[]="abc\n";
std::cout << sizeof(q) << endl; // 4
std::cout << sizeof(p) << endl; // 5
std::cout << strlen(q) << endl; // 3
std::cout << strlen(p) << endl; // 4
class X
{int i; int j; char k; };
X x;
cout<<sizeof(X)<<endl; //結果 12 ===》內存補齊
cout<<sizeof(x)<<endl; //結果 12 同上
cin.get(); }