指標和陣列相關運算
阿新 • • 發佈:2019-01-08
我們常用的 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) &陣列名,這裡的陣列名代表整個陣列。