#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);
}
先自行思考一下,没有思路了再看下边的解释吧。
先补充知识点:
地址+1操作。如果地址类型不是int型,则加1是按照指针类型所占字节数进行加的操作;是int
就只加1。比如一个结构体变量大小是20个字节,这里的加1就加上了20。
小端存储和大端存储。数据的存储有两种方式一种是大端一种是小端。小端是低位字节存低地址高位字节存高地址;大端是低位字节存高地址高位字节存低地址。我拿整型数字来举例,int a=1;整型4个字节32位是00000000 00000000 00000000 00000001(从左向右字节是从高位到低位)换成16进制00 00 00 01。
a的存储按照小端存储就是01 00 00 00;按照大端存储就是00 00 00 01。而vs ×86就是小端存储。
int a[4] = { 1,2,3,4 };初始化如下
int* ptr1 = (int*)(&a + 1);
在之前讲过&数组名是代表数组地址的意思,数值上跟首元素的地址是一样的。
加1就指向了末端元素下一位置
最后再强制类型转换,送入ptr1。
int* ptr2 = (int*)((int)a + 1);
先把a强制类型转换为整型,加1就只是加1。
ptr2比首元素地址大1,对应整型数也改变。
printf("%x %x", ptr1[-1], *ptr2);
ptr1是整型数组,ptr1[-1]可以理解为,*(ptr-1)
即最后输出结果为 00000004和 02000000,而%x是按照有效数字打印,会从第一个不是0的数字开始打印。
你做对了吗?