1. 程式人生 > >【C語言】陣列的相關運算

【C語言】陣列的相關運算

 

 

關於陣列的運算,需要注意以下幾點:

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內部表示式不參與運算