#include <stdio.h>
int main()
{
int a[4][5]={0};
a[3][4]=45;
//此处貌似个编译器bug,printf出来的是,int*型
//而监视出的结果是,类型是int[4][5]
printf("%d\n",sizeof(a+1));
//规律(知识点):数组类型+1是地址偏移个数组内元素类型大小,它指向的也是这个元素空间.但这是结果.
//原因:a的类型是int[4][5]。在表达式a+1中,a 会退化为一个指针,即int(*)[5]。
//而指针+1则是地址偏移个指针所指向类型的大小
//本例而言:a+1 a是代表了整个[4][5]数组,是数组类型,a+1就在a地址值基础上偏移个内部元素个单位,
//并指向该元素,即第二行,a+1指向类型是int[5]. 在监视中a+1类型为int[4][5]我觉得这是不对的,其类型应为int(*)[5](个人观点)
//&a+1则是偏移一个(&a)所指向类型个大小,&a是int[4][5]*类型,指向类型为int[4][5],所以&a+1的地址值为a+4*5*sizeof(int),
//即a[3][4]元素的下一个位置,注意(&a+1)类型是int[4][5]*,让其强制转化为int*,它便是个普通的整型指针
//(int*)(&a+1)-1就是&a+1的值的基础上负偏移个(int*)(&a+1)所指向的类型个单位,正好是a[3][4]
printf("%d\n",*((int*)(&a+1)-1));
return 0;
}
打印结果
4
45