int main()
{
int a[] = { 1,2,3,4 };
int* p1 = (int*)(&a + 1);//这里取地址a,是取出整个数组的地址,整个数组地址+1,跳过整个数组,
int* p2 = (int*)((int)a + 1);
printf("%x,%x", p1[-1], *p2);
return 0;
}
这里取地址a,是取出整个数组的地址,整个数组地址+1,跳过整个数组,然后强制转化为int*,其实也就是int(*p)[10],指向数组的指针-1,向后跳过一个整形,解引用得到4。
这里总结以下sizeof(arr)和sizeof(&arr)有所不同,sizeof(arr)相当于计算了里面元素个数,而sizieof(&arr)取出的是地址,可以理解为指针,而指针就是4/8个字节。取出数组的地址是要放在数组指针其实取出的也就是int(*p)【10】。而sizeof(&arr + 1))就是取出整数组的地址,整个数组地址+