数组与指针进阶|指针进阶-TWO

指针进阶-ONE
先来看看sizeof()与strlen()的基本区别

sizeof()是计算类型的字节大小。
strlen()是计算字符串的长度,以’\0’结束,但是,strlen()括号内只能是地址,才能计算。strlen()要解引用一次再进行运算。只能解引用一次,诺传递一个二级指针,是错误的。strlen 会解引用一次,然后,得到那个地址会将它进行运算。所有元素,整型或字符都是以补码的形式储存在内存中。而且是十六进制。还要考虑大小端的储存模式。如,ff aa bb 00,就会读到0停止,计算得3个字节,诺,00 aa bb ff,就是0个字节。
所以说是一个随机值。
接下来,看看二维数组。
#include int main(void) { int a[3][4]={0}; printf("%d\n",sizeof(a)); printf("%d\n", sizeof(a[0][0])); printf("%d\n", sizeof(a[0])); printf("%d\n", sizeof(a[0] + 1)); printf("%d\n", sizeof(*(a[0] + 1))); printf("%d\n", sizeof(a + 1)); printf("%d\n", sizeof(*a)); return 0; }

【数组与指针进阶|指针进阶-TWO】二维数组就与一维有些差别。数组与指针进阶|指针进阶-TWO
文章图片

二维数组可看成这个样子。a[0],a[1],a[2],元素里存放的是首元素的地址。而a+0,a+1,a+2又代表a[0],a[1],a[2],的地址。*(a+0)==a[0],
*(a+1)=a[1]。
但实际上,数组在内存中储存的模式是这样的,跟一维数组一样。
数组与指针进阶|指针进阶-TWO
文章图片

二维数组像a[0][2],a[2][3],这样的其实都是以指针的形式进行调用。
*( *(a+0)+0)--------a[0][0]
*( *(a+2)+3)--------a[2][3]
这样也是在加深对指针的理解。
好了开始看题目。
printf("%d\n",sizeof(a));
根据上一篇文章讲的,此时a代表整个二维数组,所以是3 * 4 * 4=48byte。
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
a[0][0],这个就是首元素,int类型,4个字节。
而a[0]就有点怪怪的,a[0]是代表&a[0][0]。但是,又不是表示这一个元素因为可以自己试试,a+1与a[0]+1表示的地址的不同。a[0]代表一整行。a[0][0]只是代表这一个元素。所以,sizeof(a[0])代表一整行的字节数,4*4=16byte.
printf("%d\n", sizeof(a[0] + 1));
printf("%d\n", sizeof(*(a[0] + 1)));
要知道a[0]是和*(a+0)且a是一个意思。
a[0]+1是 * (a+0)+1,所以,这是a[0][1]的地址,而
(a[0] + 1))已经解引用了,已经得到一个元素了
而地址无论是什么类型,都是4个字节。
4byte
4byte
至于剩下的,已经在上面提到了。
指针进阶-THREE

    推荐阅读