對sizeof和strlen的理解
對於sizeof和strlen的瞭解
對sizeof做一個官方的認識:sizeof() 是一種記憶體容量度量函式,功能是返回一個變數或者型別的大小(以位元組為單位);C語言中,sizeof() 是一個判斷資料型別或者表示式長度的運算子。
strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'\0'為止,然後返回計數器值(長度不包含'\0')。
strlen來說就有比較多的限制了,首先strlen要注意其後面的引數是否匹配,strlen匹配char *型別的引數(即引數必須是指標(地址)型別,如果是元素的話就報錯),匹配不合法將產生隨機值;strlen返回的大小計算是從指標所指向的那一處開始,直到遇到\0結束,返回數值大小;strlen不計算\0在內。通過以下列子大家可以更進一步的瞭解。
//一維陣列
int a[]={1,2,3,4};
(1)printf("%d\n",sizeof(a));//16 (a單獨放在sizeof括號內的時候表示整個陣列,整個陣列的大小即為4*4=16)
(2)printf("%d\n",sizeof(a+0));//4 (這裡的a表示的陣列首元素的地址,大家不要被一長段話所矇蔽,這段話總結起來就是地址,而地址的大小為4位元組,所以輸出4)
(3)printf("%d\n",sizeof(*a));//4 (這裡a同樣表示陣列首元素的地址,解引用*後表示陣列首元素,即1,1是整形,位元組大小為4,所以輸出4)
(
(5)printf("%d\n",sizeof(a[1]));//4 (a[1]表示第二個元素的值,同(3))
(6)printf("%d\n",sizeof(&a)); //4 (&a表示整個陣列的地址,說白了還是地址,因此輸出4)
(7)printf("%d\n",sizeof(&a+1));//4 (&a+1表示下一個陣列的地址,當然還是地址,輸出4)
(
(9)printf("%d\n",sizeof(&a[0]+1));//4 (表示陣列第二個元素的地址,要注意和(7)區分開)
//字元陣列
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6 (整個陣列的大小,6*1)
printf("%d\n", sizeof(arr+0));//4 (陣列首元素的地址,地址佔4個位元組)
printf("%d\n", sizeof(*arr));//1 (解引用陣列首元素的地址,即陣列首元素,即字元a,大小為1)
printf("%d\n", sizeof(arr[1]));//1 (陣列第二個元素的大小,即b的大小,輸出1)
printf("%d\n", sizeof(&arr));//4 (整個陣列的地址)
printf("%d\n", sizeof(&arr+1));//4 (跳過一個數組,下個數組的地址)
printf("%d\n", sizeof(&arr[0]+1));//4 (陣列第二個元素的地址)
printf("%d\n", strlen(arr));//隨機值 (arr是char型別的,而strlen匹配引數型別應該為char *型別,型別不匹配,產生隨機值)
printf("%d\n", strlen(arr+0));//隨機值 (同上)
printf("%d\n", strlen(*arr));//error (*arr即陣列元素,strlen匹配上元素的時候會報錯)
printf("%d\n", strlen(arr[1]));//errror (同上)
printf("%d\n", strlen(&arr));//隨機值 (&arr代表陣列的指標,指向型別為int *,型別不匹配,產生隨機值)
printf("%d\n", strlen(&arr+1));//隨機值 (同上)
printf("%d\n", strlen(&arr[0]+1));//隨機值 (同上)
char *p = "abcdef";
printf("%d\n", sizeof(p));//4 (p是一個指標,也就是地址,大小為4)
printf("%d\n", sizeof(p+1));//4 (表示下一個陣列的地址,大小為4)
printf("%d\n", sizeof(*p));//6 (表示*p的內容)
printf("%d\n", sizeof(p[0]));//1 (陣列首元素的大小)
printf("%d\n", sizeof(&p));//4 (表示指標的地址,大小為4)
printf("%d\n", sizeof(&p+1));//4 (表示下一個指標的地址,大小為4)
printf("%d\n", sizeof(&p[0]+1));//4 (表示下一個元素的地址)
printf("%d\n", strlen(p));//6 (型別匹配,直到\0結束,大小為6)
printf("%d\n", strlen(p+1));//5 (從第二個元素的地址開始數,大小為5)
printf("%d\n", strlen(*p));//error (引數為元素,報錯)
printf("%d\n", strlen(&p[0]));6 (從第一個元素開始往後數)
printf("%d\n", strlen(&p));//隨機值 (從地址開始數)
printf("%d\n", strlen(&p+1));//隨機值 (從\0後面開始數,直到遇到\0結束,產生隨機值)
printf("%d\n", strlen(&p[0]+1));//5 (從第二個元素的地址開始數,遇到\0結束,大小為5)
//二維陣列
Int a[3][4]={0};
printf("%d\n",sizeof(a));//48 (整個陣列元素的大小,3*4*4=48)
printf("%d\n",sizeof(a[0][0]));//4 (第一行第一列元素的大小)
printf("%d\n",sizeof(a[0]));//16 (第一行元素的大小:4*4=16)
printf("%d\n",sizeof(a[0]+1));//4 (表示陣列第一行第二列陣列元素的地址,相當於a[0][1])
printf("%d\n",sizeof(a+1));//4 (a表示陣列首元素的地址,a+1表示下一個元素的地址)
printf("%d\n",sizeof(&a[0]+1));//4 (同上)
printf("%d\n",sizeof(*a));//16 (二維陣列看做一維陣列,解引用)
printf("%d\n",sizeof(a[3]));//16 (第四行元素的大小,在陣列中,不會因為越界而出現錯誤,只是計算而已)