接下來我們來說說sizeof和strlen。
1.sizeof函數or關鍵字?
對於sizeof,第一點我們要清楚的是,它是一個關鍵字,並不是一個函數。正因為sizeof不是函數,因此我們不把它所要求得長度的對象叫做參數,這也是
sizeof不能求得void類型的長度
你無法求出sizeof(void),其實你是無法聲明出void的一個變量的,void指的是一個空類型,空類型你是無法知道變量內存空間大小的,所以你用sizeof去求肯定是不行的。
sizeof可以求void類型指針的長度
sizeof對於void類型的指針,因為指針,是用來存放地址的變量,在32位平臺,所有版本的編譯器都把它看作4個字節,所以你後續只要用sizeof求的是指針,就絕對是4。
sizeof能求得靜態分配內存的數組的長度
這個其實很好解釋,例如:
#include<stdio.h>#include<stdlib.h>int main(){ int arr[] = { 1, 2, 3, 4 }; printf("%d", sizeof(arr)); system("pause"); return 0;}在這裡你可以看到這裡的sizeof=類型所佔字節大小*元素個數。
void lab(int arr[4]){
int m = sizeof(arr);
printf("%d",m);}在這裡的m就是一個陷阱的提現,如果你說結果m是16,那麼你就錯了,當數組做形參時,所傳遞的並不是數組本身,在這裡數組被轉化成了指針,因為如果數組太大了,如果你要傳數組,那麼所需要創建的拷貝就很大,這樣會導致效率很低。所以其實你進行的還是對指針的sizeof,結果依然是4。
2.strlenstrlen()函數,它是一個字符串函數,它相當於一個計數器,當它遇到』\0』時就停止計數。
strlen的實現:int my_strlen(const char *str){
int len=0;
assert(str != NULL);
while ((*str++) != '/0') {
len++;
}
return len;
}strlen函數是遇到『/0』就會停止。
3. 關於strlen和sizeof的示例:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char *p = "abcdef0\0";
char arr1[] = "abcdef";
char arr2[] = { 'a', 'b', 'c','d', 'e', 'f' };
int a[] = { 1, 2, 3, 4 };
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
printf("%d\n",strlen(p));
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1])); printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(&a+1)); printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1)); printf("%d\n",sizeof(*&a));
char name[] = "abcdef"; printf("%d\n", sizeof(name[0])); printf("%d\n", sizeof(&name));
printf("%d\n", sizeof(*name)); printf("%d\n", sizeof(&name + 1));
printf("%d\n", sizeof(name + 1)); printf("%d\n", sizeof(name));
printf("%d\n", strlen(name)); printf("%d\n", strlen(&name));
printf("%d\n", strlen(&name + 1)); printf("%d\n", strlen(name + 1));
char *name = "abcdef"; printf("%d\n", sizeof(name[0])); printf("%d\n", sizeof(&name));
printf("%d\n", sizeof(*name)); printf("%d\n", sizeof(&name + 1));
printf("%d\n", sizeof(name + 1)); printf("%d\n", sizeof(name));
printf("%d\n", strlen(name)); printf("%d\n", strlen(&name));
printf("%d\n", strlen(&name + 1)); printf("%d\n", strlen(name + 1));
system("pause");
return 0;}運行結果: