1. 程式人生 > >指標和陣列相關運算

指標和陣列相關運算

我們常用的 sizeof 不是函式,它是以位元組為單位來計算不同型別的變數或陣列大小的操作符; strlen 是函式,他的引數是 char * 型別的指標,它以 ‘\0’為結束標誌求取 char * 型別的指標指向的物件到 ‘\0’ 之間元素所佔的位元組數。理解這些題目分析清楚“()“裡面的內容代表的含義是關鍵。當我們理解二維陣列時大膽的將它理解成一維陣列 例如二維陣列:int = a[3][4] = {0};可理解為 int a[] = {a[0],a[1],a[2]};只是這裡一維陣列的每個元素佔 16 個位元組,其他的完全可以按一維陣列的理解方式去理解。這裡我們不得不說說陣列和指標的關係,雖然在某些情況下使用很類似,但他們二者的關係是沒有關係,哈哈哈。以下題目的用算結果已做了驗證。
//一維陣列
	int a[] = {1,2,3,4};
	printf("%d\n",sizeof(a));      //16
	printf("%d\n",sizeof(a+0));    //4
	printf("%d\n",sizeof(*a));     //4
	printf("%d\n",sizeof(a+1));    //4
	printf("%d\n",sizeof(a[1]));   //4
	printf("%d\n",sizeof(&a));     //4
	printf("%d\n",sizeof(&a+1));   //4
	printf("%d\n",sizeof(&a[0]));  //4
	printf("%d\n",sizeof(&a[0]+1));//4

	//字元陣列
	char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n",sizeof(arr));      //6
	printf("%d\n",sizeof(arr+0));    //4
	printf("%d\n",sizeof(*arr));     //1
	printf("%d\n",sizeof(arr[1]));   //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));      //隨機數 假設19
	printf("%d\n",strlen(arr+0));    //19
	printf("%d\n",strlen(*arr));     //error
	printf("%d\n",strlen(arr[1]));   //error
	printf("%d\n",strlen(&arr));     //19
	printf("%d\n",strlen(&arr+1));   //13
	printf("%d\n",strlen(&arr[0]+1));//18

	char *p = "abcdef";
	printf("%d\n",sizeof(p));      //4
	printf("%d\n",sizeof(p+1));    //4
	printf("%d\n",sizeof(*p));     //1
	printf("%d\n",sizeof(p[0]));   //1
	printf("%d\n",sizeof(&p));     //4
	printf("%d\n",sizeof(&p+1));   //4
	printf("%d\n",sizeof(&p[0]+1));//4

	printf("%d\n",strlen(p));      //6
	printf("%d\n",strlen(p+1));    //5
	printf("%d\n",strlen(*p));     //error
	printf("%d\n",strlen(p[0]));   //error
	printf("%d\n",strlen(&p));     //隨機數
	printf("%d\n",strlen(&p+1));   //隨機數
	printf("%d\n",strlen(&p[0]+1));//5

	//二維陣列
	int a[3][4] = {0};             //a[3][4] = {a[0],a[1],a[2]};
	printf("%d\n",sizeof(a));      //48
	printf("%d\n",sizeof(a+1));    //4
	printf("%d\n",sizeof(a[0][0]));//4
	printf("%d\n",sizeof(a[0]));   //16
	printf("%d\n",sizeof(&a[0]+1));//4
	printf("%d\n",sizeof(*a));     //16
	printf("%d\n",sizeof(a[3]));   //16
注:只有兩種情況下陣列名代表整個陣列:(1) sizeof(陣列名),這裡的陣列名代表整個陣列 (2) &陣列名,這裡的陣列名代表整個陣列。