以下是引用zx315在2016-8-13 00:08:03的发言:
int multi[2][4];
首先,数组名可以作为指向数组第一个元素的指针。然后,所谓二维数组,然后是数组元素是一维数组的一维数组。
因此:
multi 是一个指向含有 3 个整型元素的指针;
multi[0] 其实是一个一维数组,所以它是一个指向整数的指针;
multi[0][0] 很显然就是二维数组的第一个元素。
int (*p1)[3] = multi;
int *p2 = multi[0];
int *p3 = &multi[0][0];
p1 跟 p2, p3 显然是类型不一样的指针;而 p2, p3 是类型相同的指针。
确是,体现了指针的两个重要属性:地址和长度。
虽然都是int指针,都指向同一地址,但他们的内含不同。
这样看看好理解点:
#include <stdio.h>
int multi[2][4];
int main(void)
{
printf("\nmulti = %d", multi);
printf("\nmulti[0] = %d", multi[0]);
printf("\n&multi[0][0] = %d\n", &multi[0][0]);
int (*p)[4] = multi;
int *p0
= multi[0];
int *p00 = &multi[0][0];
printf("p = %d\n", p);
printf("p0 = %d\n", p0);
printf("p00 = %d\n", p00);
printf("++p = %d\n", ++p);
printf("++p0 = %d\n", ++p0);
printf("++p00 = %d\n", ++p00);
return 0;
}
结果:
multi = 4214816
multi[0] = 4214816
&multi[0][0] = 4214816
p = 4214816
p0 = 4214816
p00 = 4214816
++p = 4214832
++p0 = 4214820
++p00 = 4214820
可见 p 长度是16, p0和p00是4。