1、在一些面試或者閱讀代碼時經常遇到這兩個函數,下面介紹我對這兩個的理解,同時驗證也是正確的,
sizeof()不是一個函數,是一個關鍵字,strlen()是一個函數,
strlen()測得是一個字符串的長度,就是實際存放的幾個字符,不包括結束符 ‘\0’,
sizeof()測得是一個類型的大小,但對指針測得長度是4,也就是說:只要是指針變量測得長度都是4,
下面來看一段代碼:
int main( int agc, char argv[ ])
{
char buf [20] ="abcdf";
char buffer [40] ="";
char *p=buf ;
printf("sizeof_buf=%d\n" ,sizeof(buf)); //這裏buf代表的是buf數組存放了20個大小的的char型,所以其結果爲20,
printf("sizeof_*p=%d\n" , sizeof(p) ); //這裏測得是指針變量類型的長度,其結果爲4
printf("strlen_buf=%d\n", strlen(buf)); //也是測字符串長度,其結果爲5
printf("strlen_*p=%d\n",strlen(p)); //這裏也是測得字符串長度,所以結果爲5
printf("strlen=%d\n",strlen(buffer)); //這裏buffer初始值爲0,所以測字符串長度是0
printf("sizeof=%d\n",sizeof(buffer)); //在這裏buffer裏面存放的是40個char型的變量,所以輸出結果是40
}
2、計算內存容量:
用運算符sizeof 可以計算出數組的容量(字節數)。如下的第一段代碼,sizeof(a)的值是12(注意別忘記了‘\0’)。指針p指向a,但是sizeof(p)的值卻是4.這是因爲sizeof(p)得到的是一個指針變量的字節數,相當於sizeof(char *) ,而不是p所指向的內存容量。C++/C語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。
注意當數組做爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。示例第二段代碼中。不論數組a的容量是多少,sizeof(a)始終等於sizeof(char *)。
第一段代碼:
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; //12字節
cout<< sizeof(p) << endl; //4字節
第二段代碼(數組退化爲指針):
void Func(char a[100] )
{
cout<< sizeof(a) <<endl; //4字節而不是100字節
}
華三的關於sizeof測試題和答案
1、
char *str="abcde";
char *p=str;
printf("%d\n",sizeof(p)); //4
printf("%d\n",sizeof(*p)); //1
printf("%d\n",sizeof(str)); //4
printf("%d\n",sizeof("abcde")); //6