前言:
前面介绍了指针的大体内容,如果接下来能够把这些代码的含义搞得清清楚楚,那么你就是代码king!
一维数组:
cpp
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个字节。
字符数组:
cpp
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'停止。
字符串:
cpp
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。
熏帝们,到这还没有结束,等下期继续!!