首先,讓我們先了解一些strlen和sizeof的定義 :
一、strlen
1、strlen所作的是一個計數器的工作,它從記憶體的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不确定的記憶體區域)開始掃描,直到碰到第一個字元串結束符’\0’為止,然後傳回計數器值(長度不包含’\0’)。注:用char s[6] = “string”; 這種初始化方法時, 後面的常量字元串"string"占7位元組, 最後一個位元組為’\0’。如果你用char s[6] = {‘s’,‘t’,‘r’,‘i’,‘n’,‘g’};這種方式并不能将s初始化為一個字元串. 沒有以’\0‘結尾,’它隻是一個容納了char的數組. 隻有以’\0’結尾的char數組才能稱之為字元串.
2、strlen是一個函數。strlen(char*)函數求的是字元串的實際長度,它求得方法是從開始到遇到第一個’\0’,如果你隻定義沒有給它賦初值,這個結果是不定的,它會從aa首位址一直找下去,直到遇到’\0’停止。注:這裡需要特别注意,strlen求的是字元串實際長度。如 int a[ 5 ] ={1,2,3,4,5} strlen(a) //錯誤,數組a不是字元數組。
二、sizeof
1、在 C 語言中,sizeof() 是一個判斷資料類型或者表達式長度的運算符。sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是傳回一個對象或者類型所占的記憶體位元組數。注:記住是記憶體位元組數,具體的資料類型對應具體的位元組數。
三、兩者的差別
樣例1:
#include
#include
using namespace std;
int main(void)
{
char aa[200]={’\0’};
cout<<strlen(aa)<<endl;
return 0;
}
/這個樣例結果為0而sizeof()傳回的是變量聲明後所占的記憶體數,不是實際長度,此外sizeof不是函數,僅僅是一個取位元組運算符,
strlen是函數。/
樣例2:
#include
#include
using namespace std;
int main(void)
{
char aa[200]=“Hello, World!”;
cout<<strlen(aa)<<endl;
return 0;
}
/這個樣例的結果為13(逗号後面有一個空格)/
樣例3:
#include
#include
using namespace std;
int main(void)
{
char aa[200]=“hello”;
cout << strlen(aa) << endl;
return 0;
}
//這個樣例的結果為5
sizeof(aa); //傳回200
int a[10];
sizeof(a)
//傳回40 (根據語言int型 c/c++由編譯器決定是兩個或四個 java 是四個)
1、對靜态數組的處理:
char str[20000]=“0123456789”;
int a=strlen(str); //a=10; >> strlen 計算字元串的長度,以結束符 0x00 為字元串結束。
int b=sizeof(str); //而b=20000; >> sizeof 計算的則是配置設定的數組 str[20000] 所占的記憶體空間的大小,不受裡面存儲的内容改變。
2、對指針的處理:
char* ss = “0123456789”;
sizeof(ss) //結果 4>>ss是指向字元串常量的字元指針,sizeof 獲得的是一個指針的值所占的空間,是char*類型,是以是4
sizeof(*ss) //結果 1>> *ss是第一個字元 其實就是獲得了字元串的第一位’0’ 所占的記憶體空間,是char類型的,占了 1 位
strlen(ss)= 10 //>> 如果要獲得這個字元串的長度,則一定要使用 strlen
//sizeof傳回對象所占用的位元組大小. 正确
//strlen傳回字元個數. 正确
在使用strlen時,有一個很特别的情況,就是數組名到指針蛻變
char Array[2000] = {‘0’};
sizeof(Array) == 2000;
char *p = Array;
strlen( p ) = 1; //結果為1
sizeof( p )= 4 //結果為4
//在傳遞一個數組名到一個函數中時,它會完全退化為一個指針
部分内容參考自百度百科