1、对于上次数组有关sizeof的解析如下:


//一维数组


int a[] = { 1, 2, 3, 4 };   

printf("%d\n", sizeof(a));  // 这里 a代表数组首元素地址,sizeof(a)求得是整个数组                                        的长度:16

printf("%d\n", sizeof(a + 0));//  a+0代表指向数组第一个元素的指针,即&a[0]:4

printf("%d\n", sizeof(*a));//  *a代表解引用首元素地址的元素,即a[0]:4

printf("%d\n", sizeof(a + 1));//  a+1代表指向数组第二个元素的指针,即&a[1]:4

printf("%d\n", sizeof(a[1]));//  a[1]代表数组第二个元素:4

printf("%d\n", sizeof(&a)); //  &a代表取整个数组的地址,其值和a相同,即&a[0]:4

printf("%d\n", sizeof(&a + 1));//&a+1代表指向整个数组下一个位置的指针,指向了元素4                                           后面的那个地址,仍是一个指针:4

printf("%d\n", sizeof(&a[0]));//&a[0]代表取第一个元素的地址,同&a:4

printf("%d\n", sizeof(&a[0] + 1));// &a[0]+1代表指向第二个元素的指针,即指向a[1]的                                               指针:4


//二维数组

int a[3][4] = { 0 };


printf("%d\n", sizeof(a));   //  同上,求的是整个数组的长度:48

printf("%d\n", sizeof(a[0][0]));//a[0][0]代表第一个元素:

printf("%d\n", sizeof(a[0]));//  a[0]代表第一维,是一个数组名,而它的元素是四个整                                            形,所以a[0]同一维数组中的数组名一样:16

printf("%d\n", sizeof(a[0] + 1));//a[0]+1代表指向a[0][1]的指针,即&a[0][1]:4

printf("%d\n", sizeof(a + 1));// a+1,a是指向数组首元素(这里是第一维,将a看成一个一                    维数组)的地址,所以a+1就指向了第二个数组元素(即第二维),是一个指针:4  

printf("%d\n", sizeof(&a[0] + 1));// 同上,因为&a[0]即是a:4

printf("%d\n", sizeof(*a));// *a代表*(a+0),即a[0]:16

printf("%d\n", sizeof(a[3]));//  a[3]即 *(a+3),是个数组名,同上,只不过在这里,                                          越界,指向了第四行:16 

2、总结如下:

理解数组方法如:先用一维数组说明,

《1》数组名:永远表示指向数组首元素的地址;

例1:int a[10];

      a代表指向数组首元素的地址,唯有在两个地方不同,(1)sizeof(a)代表求整个数组的长度;(2)&a 代表数组的地址,即是一个指向数组的指针,除此之外都代表数组首元素的地址。

《2》下标的运算

例2:a+1  代表的是指向第二个元素的指针,因为a是首元素地址,以此为长度基准增加1,即指向了第           二个元素

    注:下标运算增减的长度都是根据前一个变量所表示的量为基准增减量。

《3》多维数组

多维数组所有的规则同一维数组一样,只是将多维数组看成了一维数组,其中的元素又是数组而已。

例3:int a[3][4];

    可以将其看成一个一维数组,有三个元素a[0],a[1],a[2],不同的是这三个元素的值又是数组,每个数组有四个int元素,所以,a[0],a[1],a[2]又可以看成是三个数组名了

综上,根据以上规则,即可理解上面代码中的各种变换,数组的深入理解很重要。