數組的初始化
數組及指針在內存中的存儲
一維數組在內存中的存儲
有關數組的運算
//一維數組
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16這里的a表示的是整個數組,計算出的是整個數組的大小,單位為byte
printf("%d\n",sizeof(a + 0));/*a沒有單獨放在sizeof括號后面,此時的a表示的是數組a的首地址,加零還是地址計算出是4*/
printf("%d\n",sizeof(*a));//a代表的是數組首地址,*a解引用為a[0],計算出是4
printf("%d\n",sizeof(a + 1));//數組指向第二個元素
printf("%d\n",sizeof(a[1]));//a[1]代表2
printf("%d\n",sizeof(&a));//數組的地址,地址的大小為4byte
printf("%d\n",sizeof(&a + 1));//指向4的后面,加1還是地址,大小為4byte
printf("%d\n",sizeof(&a[0]));//&a[0]為a[0]的地址,4
printf("%d\n",sizeof(&a[0] + 1));//指向a[1],a[1]地址是4
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//6,數組名代表整個數組,計算出為整個數組的大小
printf("%d\n",sizeof(arr + 0));//4數組名代表首地址,首地址加1是第二個數組的地址,大小是4
printf("%d\n",sizeof(*arr));/*1數組名未單獨放在sizeof后面,此時的arr代表數組首地址,*a解引用后為a[0]*/
printf("%d\n",sizeof(arr[1]));//arr[1]是字符b,字符b的類型為char,大小為1
printf("%d\n",sizeof(&arr));//&arr代表整個數組的地址,數組的地址還是地址,大小為4
printf("*d\n",sizeof(&arr + 1));//&arr + 1指向數組的后面,大小還是4
printf("%d\n",sizeof(&arr[0] + 1));//&arr[0]取出的是arr[0]的地址,加1則變成arr[1]的地址大小是4
printf("%d\n",strlen(arr));/*arr代表數組首元素的地址,從數組的第一個元素往后數直到遇到'\0'停止,可是在f后面數組到底存放了什么我們都不知道,所以是隨機值*/
printf("%d\n",strlen(arr + 0));//和上面的情況相同,隨機值,并且這個隨機值和上面的值相等
printf("%d\n",strlen(*arr));/* *arr是字符a,而strlen將'a'的ASCII碼當做了地址,但這個地址不允許被訪問,所以出錯,程序掛掉了*/
printf("%d\n",strlen(arr[1]));//和上面的解釋相同,程序崩潰
printf("%d\n",strlen(&arr));//&arr代表數組的地址,指向第一個元素,因為往后找不到'\0',輸出隨機值
printf("%d\n",strlen(&arr + 1));/* &arr代表整個數組的地址加1后跳過整個數組,還是找不到'\0',輸出隨機值,但是比上一個小6*/
printf("%d\n",str(&arr[0] + 1));//指向第二個數組元素,輸出還是隨機值,但輸出的值比strlen(&arr)小1
//二維數組
int a[3][4] = {0};
printf("%d\n",sizeof(a));/*數組名單獨放在sizeof()中,此時數組名代表整個數組,計算出的是整個數組的大小單位是byte,數組總共有3 * 4 = 12個元素,一個元素是4個字節,則計算出為48個字節
printf("%d\n",sizeof(a[0][0]));//a[0][0]是整形,整形的大小是4個字節
printf("%d\n",sizeof(a[0]));//a[0]是二維數組首元素名,單獨放在sizeof后面,計算出的是數組首元素的地址,大小是二維數組第一行元素的大小,16
printf("%d\n",sizeof(a[0] + 1);//表示數組a[0][1]的大小,4
printf("%d\n",sizeof(&a[0] + 1));//指向a[1][0],代表第二行的地址,大小是4
printf("%d\n",sizeof(*a));//此處a代表數組首元素的地址,解引用是第一行16
printf("%d\n",sizeof(a[3]));//sizeof后面的表達式不參與運算,16