题目:
int main()
{ int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
思路分析:
int *ptr1 = (int *)(&aa + 1);
- &aa表示整个数组的地址,&aa+1表示越过了一个数组大小的地址位置,整个数组的地址在首元素地址之前的内存空间中,因此如上图所示。
- (int*)是强制类型转化,将其转化为int类型的指针。
int *ptr2 = (int *)(*(aa + 1));
aa相当于首元素地址,在二维数组中首元素地址就是第一行的地址,而aa+1表示的就是第二行地址
且aa+1 又可以转化为aa[1]表示数组名,表示的是第二行的数组名,那么可以表示第二行第一个元素的地址而*就表示第二行第一个元素,此处的int*强制类型转化是没有用的。
*(ptr1 - 1), *(ptr2 - 1)
*(ptr1 - 1)
- *(ptr1-1)ptr因为是int类型的指针,且被传输了&aa+1的地址,那么ptr-1根据数据类型-1就是减去四个字节,所以根据上图所示,我们得知ptr-1就是指向整个数组的最后一个元素。
- *(ptr-1)就是最后一个元素 10
*(ptr2 - 1)
ptr2-1就是第二行第一个元素减一,就是第一行最后一个元素,所以表示的就是元素5
结论:
- 在二维数组中,数组名+1 = 数组名[1] 即表示第二行的地址又表示了第二行第一个元素的地址。