我们来看一道笔试题
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a[4] = { 1, 2, 3, 4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x", ptr1[-1], *ptr2); // 4,2000000
return 0;
}
题目的要求是求打印结果是什么
- ptr1[-1]
题目中ptr1 = (int*)(&a + 1)
&a求的是整个数组的地址
&a+1就是指针向后偏移整个数组长度于是ptr1指向了整个数组的最后一个元素紧挨的下一个元素的地址,你会说数组越界了,没错(不清楚看下图)
- ptr2
ptr2 = (int)((int)a + 1)
首先明白一点a是首元素地址
将a强转成int型再加1不过是将a首元素地址的偏移了一个字节
就相当于从a[0]的第二个字节开始
直接看图吧