1. 程式人生 > >對sizeof和strlen的理解

對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)

4)printf("%d\n",sizeof(a+1));//4   (a表示首元素的地址,a+1表示第二個元素的地址,同樣不要被這麼多的話所迷惑,總之還是地址,輸出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)
8)printf("%d\n",sizeof(&a[0]));
//4(表示陣列首元素的地址,輸出4,要注意與(6)的不同)
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 (第四行元素的大小,在陣列中,不會因為越界而出現錯誤,只是計算而已)