前言:
? ? ? ? 前面介紹了指針的大體內容,如果接下來能夠把這些代碼的含義搞得清清楚楚,那么你就是代碼king!
一維數組:
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
這些大家做做,答案應該都是什么?
? ? ? ? 咱們可以談論討論:
????????注:sizeof(arr)可以計算arr整個數組的大小!!
1、不必多說答案是16(一個整型數據占4個字節)
2、sizeof(a+0)這里表示的是第一個元素的地址的大小為4
3、sizeof(*a),a是一個指針,里面放的是一個地址(首元素的),解引用就相當于第一個元素,所以這里相當于計算一個元素大小為4個字節。
4、sizeof(a+1)表示首元素地址加一,也就是相當于第二個元素的地址,大小為4個字節。
5、sizeof(a[1])表示第2個元素的大小,大小是4個字節
6、sizeof(&a)表示取出a整個數組的地址,但是在a中保存的是首元素的地址,只有加減的時候才會跳過整個數組的大小,大小為4個字節。(不要被迷惑)
7、sizeof(*&a)表示整個數組的地址放在指針中,也是一個整形指針大小為4個字節。
8、sizeof(&a+1)表示取出a整個數組的大小,然后向后跳過整個數組的大小,指向的是第a+4個元素的地址,大小是4個字節。
9、sizeof(&a[0])表示的是a[0]的地址,大小是4個字節。
10、sizoef(&a[0]+1)表示的是a[0]的地址,向后訪問一個整型的大小地址,大小為4個字節。
字符數組:
char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr + 0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr + 1));printf("%d\n", sizeof(&arr[0] + 1));printf("%d\n", strlen(arr));printf("%d\n", strlen(arr + 0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr + 1));printf("%d\n", strlen(&arr[0] + 1));
直接開始分析!
注:strlen計算的是數組里面元素的個數!!
1、sizeof(arr)直接計算的是整個數組的大小,大小為6個字節
2、sizeof(arr+0)表示的是第1個元素的地址,地址的話是4個字節(千萬注意表示的不是第1個字符)
3、sizeof(*arr)表示的是一個字符指針,里面放的是第一個字符的地址并且解引用,就是第一個字符,大小為1個字節。
4、sizeof(arr[1])表示的是第二個字符,大小為1個字節。
5、sizeof(&arr)表示的是取出整個數組的地址,大小為4個字節。
6、sizeof(&arr+1)表示的是向后跳過整個數組的大小(6個字節)后的地址,大小為4個字節。
7、sizeof(&arr[0]+1)表示的是第二個元素的地址,大小為4個字節。
8、strlen(arr)表示的是計算整個字符串數組的長度,大小為隨機值(注意里面沒有\0,strlen讀取到\0才終止)
9、strlen(arr+0)表示的是從第一個字符開始往后讀取,直到遇到\0停止,大小為隨機值。
10、strlen(*arr),相當于strlen('a')。大小為隨機值。
11、strlen(arr[1]),相當于strlen('a'),大小同樣為隨價值。
12、strlen(&arr)相當于&arr是取出整個數組的地址,但是里面存的還是首元素的地址,所以還是從首元素開始往后讀,直到遇到\0停止,還是隨機值。
13、strlen(&arr+1)表示的是跳過整個數組大小的長度,開始往后讀遇到'\0'停止,還是隨機值。
14、strlen(&arr[0]+1)表示的是從第二個字符開始往后讀,遇到'\0'停止。
字符串:
????????
char arr[] = "abcdef";printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr + 0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr + 1));printf("%d\n", sizeof(&arr[0] + 1));printf("%d\n", strlen(arr));printf("%d\n", strlen(arr + 0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr + 1));printf("%d\n", strlen(&arr[0] + 1));
? ?最后再看一組:
1、sizeof(arr)?整個數組的大小,結果為7。(注意字符串中結尾自帶'\0')。
2、sizeof(arr+0)? ?首元素的地址,結果為4。
3、sizeof(*arr)首元素,大小為1。
4、sizeof(arr[1])第二個元素,大小為1。
5、sizeof(&arr)整個數組是地址,大小為4.
6、sizeof(&arr+1)跳過整個數組后的地址,大小為4
7、sizeof(&arr[0]+1)第二個元素的地址,大小為4.
8、strlen(arr),從第一個元素開始往后讀,直到遇到'\0'停止,結果為6.
9、strlen(arr+0),和上一個一樣的,大小為6。
10、strlen(*arr),相當于strlen(arr[0]),大小為隨機值。
11、strlen(arr[1]),大小為隨機值。
12、strlen(&arr),大小為6。
13、strlen(&arr+1),結果為隨機值。
14、strlen(&arr[0]+1),是從第二個元素開始訪問,直到遇到'\0'停止,結果為5。
熏帝們,到這還沒有結束,等下期繼續!!