【C語言】陣列的相關運算
阿新 • • 發佈:2018-12-09
關於陣列的運算,需要注意以下幾點:
1. sizeof(陣列名):陣列名錶示整個陣列
sizeof(陣列名)計算的是整個陣列的大小,單位是位元組
2. &陣列名:陣列名錶示整個陣列
&陣列名取的是陣列的地址,這裡的陣列名錶示整個陣列
3. 除此之外,所有的陣列名錶示首元素地址
4. 二維陣列要看首元素的地址,首先要把二維陣列想成一維陣列
5. 地址是四個位元組
6. strlen的運算遇到'\0'才會結束
一維陣列
int a[] = {1,2,3,4}; printf("%d\n", sizeof(a)); //16 注:a表示整個陣列 printf("%d\n", sizeof(a+0)); //4 注:a+0表示首元素的地址 printf("%d\n", sizeof(*a)); //4 注:*a表示首元素的地址 printf("%d\n", sizeof(a+1)); //4 注:a+1表示下標為1的元素的地址 printf("%d\n", sizeof(a[1])); //4 注:a[1]表示下標為1的元素的地址 printf("%d\n", sizeof(&a)); //4 注:&a表示陣列的地址 printf("%d\n", sizeof(*&a)); //16 注:*&a表示整個陣列 printf("%d\n", sizeof(&a+1)); //4 注:&a+1表示地址(跳過整個陣列) printf("%d\n", sizeof(&a[0])); //4 注:&a[0]表示首元素地址 printf("%d\n", sizeof(&a[0]+1)); //4 注:&a[0]+1表示第二個元素的地址
字元陣列
char arr[] = {'a','b','c','d','e','f'}; printf("%d\n", sizeof(arr)); //6 注:arr表示整個陣列 printf("%d\n", sizeof(arr+0)); //4 注:arr+0表示首元素的地址 printf("%d\n", sizeof(*arr)); //1 注:*arr表示首元素,即a printf("%d\n", sizeof(arr[1])); //1 注:arr[1]表示第二個元素,即b printf("%d\n", sizeof(&arr)); //4 注:&arr表示陣列的地址 printf("%d\n", sizeof(*&arr)); //6 注:*&arr表示整個陣列 printf("%d\n", sizeof(&arr+1)); //4 注:&arr+1表示第二個元素的地址 printf("%d\n", sizeof(&arr[0]+1)); //4 注:&arr[0]+1表示第二個元素的地址 //strlen遇到'\0'才會結束 printf("%d\n", strlen(arr)); //隨機數 注:arr表示首元素地址,從首元素向後數字符,而數組裡面沒有'\0',所以不會結束 printf("%d\n", strlen(arr+0)); //隨機數 注:arr+0表示首元素地址,從元素'a'向後數字符 printf("%d\n", strlen(*arr)); //error 注:*arr表示a元素,即數字97 printf("%d\n", strlen(arr[1])); //error 注:arr[1]表示b元素,即數字98 printf("%d\n", strlen(&arr)); //隨機數 注:&arr表示陣列的地址,從元素'a'向後數字符 printf("%d\n", strlen(&arr+1)); //隨機數 注:&arr+1表示從元素'f'向後數字符 printf("%d\n", strlen(&arr[0]+1)); //隨機數 注:&arr[0]+1表示從元素'b'向後數字符 char arr[] = "abcdef"; //包含'\0' printf("%d\n", sizeof(arr)); //7 注:arr表示整個陣列,整個陣列有7個元素 printf("%d\n", sizeof(arr+0)); //4 注:arr+0表示首元素的地址 printf("%d\n", sizeof(*arr)); //1 注:*arr表示首元素,即'a' printf("%d\n", sizeof(arr[1])); //1 注:arr[1]表示第二個元素,即'b' printf("%d\n", sizeof(&arr)); //4 注:&arr表示整個陣列的地址 printf("%d\n", sizeof(&arr+1)); //4 注:&arr+1表示地址,跳過整個陣列,指向'\0'之後 printf("%d\n", sizeof(&arr[0]+1)); //4 注:&arr[0]+1表示元素'b'的地址 printf("%d\n", strlen(arr)); //6 注:arr表示首元素地址,從元素'a'向後數字符,到'\0'結束 printf("%d\n", strlen(arr+0)); //6 注:arr+0表示首元素地址,從元素'a'向後數,到'\0'結束 printf("%d\n", strlen(*arr)); //error 注:*arr表示'a'元素,即數字97 printf("%d\n", strlen(arr[1])); //error 注:arr[1]表示'b'元素,即數字98 printf("%d\n", strlen(&arr)); //6 注:&arr表示整個陣列的地址,從元素'a'向後數字符,到'\0'結束 printf("%d\n", strlen(&arr+1)); //隨機值 注:&arr+1表示跳過整個陣列,從元素'\0'向後數字符 printf("%d\n", strlen(&arr[0]+1)); //5 注:&arr[0]+1表示從元素'b'向後數字符,到'\0'結束 char *p = "abcdef"; //p裡面存的是字元a的地址 printf("%d\n", sizeof(p)); //4 注:p是指標變數 printf("%d\n", sizeof(p+1)); //4 注:p+1表示b的地址 printf("%d\n", sizeof(*p)); //1 注:*p表示首元素,即元素'a' printf("%d\n", sizeof(p[0])); //1 注:p[0]相當於*[p+0],表示首元素,即元素'a' printf("%d\n", sizeof(&p)); //4 注:&p表示p的地址,p是char *型別的 printf("%d\n", sizeof(&p+1)); //4 注:&p+1表示地址(跳過一個p) printf("%d\n", sizeof(&p[0]+1)); //4 注:&p[0]+1表示元素'b'的地址 printf("%d\n", strlen(p)); //6 注:p表示元素'a'的地址,從元素'a'向後數字符,到'\0'結束 printf("%d\n", strlen(p+1)); //5 注:p+1表示元素'b'的地址,從元素'b'向後數字符,到'\0'結束 printf("%d\n", strlen(*p)); //error 注:*p表示首元素 printf("%d\n", strlen(p[0])); //error 注:p[0]表示首元素 printf("%d\n", strlen(&p)); //隨機值 注:&p表示p的地址 printf("%d\n", strlen(&p+1)); //隨機值 注:&p+1表示地址(跳過p) printf("%d\n", strlen(&p[0]+1)); //5 注:&p[0]+1表示元素'b'的地址,從元素'b'向後數字符,到'\0'結束
二維陣列
int a[3][4] = {0}; printf("%d\n", sizeof(a)); //48 注:a表示整個陣列 printf("%d\n", sizeof(a[0][0])); //4 注:a[0][0]表示第一行第一個元素 printf("%d\n", sizeof(a[0])); //16 注: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 注:&a[0]+1表示第二行的地址 printf("%d\n", sizeof(*a)); //16 注:*a表示第一行 printf("%d\n", sizeof(a[3])); //16 注:a[3]相當於a[1],sizeof內部表示式不參與運算