题目:
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
思路分析:
int(*p)[4];
- 定义了指针变量p是一个数组指针,且该数组指针指向的数组内具有四个元素。
- 当进行p+1的时候,加上的就是四个元素的字节大小之和。
p = a;
- a表示的是数组名,二维数组的数组名表示的是二维数组的第一行的地址,由于地址的特性,是处在数组元素之前的内存空间内。
- 所以如上图所示
&p[4][2] - &a[4][2];
- 因为p是一个int类型的指针数组,指针数组的跨度是4个元素,而p[4][2] 相当于一个二维数组,取的是第四行下标为2的元素。
- &a[4][2]取的就是a数组中第四行下标为2的元素的地址
- &p[4][2] 表示的就是p+4这一个跨度中,下标为2的元素地址和&a[4][2]相减,得到的是-4。