天天看點

數組中的strlen和sizeof

先介紹strlen():

strlen()是函數,要在運作時才能計算。參數必須是字元型指針(char*)。當數組名作為參數傳入時,實際上數組就退化成指針了。它的功能是:傳回字元串的長度。該字元串可能是自己定義的,也可能是記憶體中随機的,該函數實際完成的功能是從代表該字元串的第一個位址開始周遊,直到遇到結束符NULL。傳回的長度大小不包括NULL。

sizeof() 是運算符,參數可以是數組(編譯時配置設定的數組空間大小)、指針(存儲該指針所用的空間大小)、類型(該類型所占的空間大小)、對象(對象的實際占用空間大小)、函數(函數的傳回類型所占的空間大小,函數的傳回類型不能是void)等。它的功能是獲得保證能容納實作所建立的最大對象的位元組大小。

關于數組在使用時的要點:

1.數組名單獨放在sizeof()内部時,數組表示整個數組。

2.&數組名,數組名表示整個數組。ex:&arr表示數組的位址。

!!!除此之外所有遇到的數組名引用都是數組首元素的位址!!!

字元數組:

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));			//6	整個數組大小
	printf("%d\n", sizeof(arr + 0));		//4	arr[0]位址大小
	printf("%d\n", sizeof(*arr));			//1	arr[0]的大小
	printf("%d\n", sizeof(arr[1]));			//1	arr[1]的大小
	printf("%d\n", sizeof(&arr));			//4	數組的位址(也是位址)
	printf("%d\n", sizeof(&arr + 1));		//4	整個數組位址+1,跳出數組,依然是位址
	printf("%d\n", sizeof(&arr[0] + 1));		//4	第一個元素位址+1,代表第二個元素位址

	printf("%d\n", strlen(arr));			//	從a的位址開始,遇到\0結束,生成随機數 
	printf("%d\n", strlen(arr + 0));		//	同上
	//printf("%d\n", strlen(*arr));			//	strlen()參數必須是字元型指針
	//printf("%d\n", strlen(arr[1]));		//	同上
	printf("%d\n", strlen(&arr));			//	警告!整個數組的位址,遇到\0結束,生成随機數
	printf("%d\n", strlen(&arr + 1));		//	警告!數組的位址+1,跳出數組,依然是遇到\0結束,生成随機數 
	printf("%d\n", strlen(&arr[0] + 1));		//	第一個元素位址+1,第二個元素的位址,遇到\0結束,生成随機
        return 0;
}
           

字元串:

char *p = "abcdef";				//字元串 需注意後面有 \0
	printf("%d\n", sizeof(p));		//4	指針Pa的位址
	printf("%d\n", sizeof(p + 1));		//4	a的位址+1,b的位址
	printf("%d\n", sizeof(*p));		//1	對a位址的截引用,為char類型大小
	printf("%d\n", sizeof(p[0]));		//1	a,char類型
	printf("%d\n", sizeof(&p));		//4	p字元串的頭指針
	printf("%d\n", sizeof(&p + 1));		//4	p的指針+1,跳出p,依然為指針
	printf("%d\n", sizeof(&p[0] + 1));	//4	首元素位址+1,依然是指針
	printf("%d\n", strlen(p));		//6	從a的位址,遇到\0結束,但不包括\0
	printf("%d\n", strlen(p + 1));		//5	從b的位址開始,遇到\0結束
	//printf("%d\n", strlen(*p));		//	必須為位址
	//printf("%d\n", strlen(p[0]));		//	同上
	printf("%d\n", strlen(&p));		//	p的位址,二級指針,有警告,級别不同,生成随機數
	printf("%d\n", strlen(&p + 1));		//	p的位址+1,跳出p,二級指針,有警告,級别不同,生成随機數
	printf("%d\n", strlen(&p[0] + 1));	//5	b的位址,從b開始,遇\0結
           

整形數組:

int a[] = { 1, 2, 3, 4 };			
	printf("%d\n", sizeof(a));		//16	數組名單獨放在sizeof中代表整個數組,求數組大小,以位元組為機關
	printf("%d\n", sizeof(a + 0));		//4	數組名不是單獨放在sizeof中,代表數組第一個元素的位址
	printf("%d\n", sizeof(*a));		//4	*為截引用符号,a代表首元素位址,對首元素位址截引用就是首元素,int類型
	printf("%d\n", sizeof(a + 1));		//4	a不是單獨在sizeof中,a代表首元素位址,a+1代表第二個為元素位址,指針類型
	printf("%d\n", sizeof(a[1]));		//4	代表第二個元素,是int類型
	printf("%d\n", sizeof(&a));		//4	數組位址的位址
	printf("%d\n", sizeof(&a + 1));		//4	數組位址+1,就跳出這個數組的位址,仍然為位址
	printf("%d\n", sizeof(&a[0]));		//4	對首元素取位址,等價于a
	printf("%d\n", sizeof(&a[0] + 1));	//4	首元素位址+1,第二個元素的位址
           

二維數組:

int  a[3][4] = { 0 };
	printf("%d\n", sizeof(a));		//48	數組大小
	printf("%d\n", sizeof(a[0][0]));	//4		
	printf("%d\n", sizeof(a[0]));		//16	把a[0]看成數組名,單獨在sizeof中,代表整個數組a[0]
	printf("%d\n", sizeof(a[0] + 1));	//4	a[0][1]位址
	printf("%d\n", sizeof(a + 1));		//4	第二行位址a[1][]
	printf("%d\n", sizeof(&a[0] + 1));	//4	對第一行元素取位址,+1後還是位址,等價于a+1
	printf("%d\n", sizeof(*a));		//16	a代表第一行元素,*截引用,為第一行元素
	printf("%d\n", sizeof(a[3]));		//16	越界,但是編譯不占記憶體,大小為16  
           

繼續閱讀