main() {char a[8]={1,2,3,4,5,6,7,8}; short *p=(short*)(&a+1); cout<<*--p<<endl; } 程
2个回答
展开全部
char a[8]={1,2,3,4,5,6,7,8};
short *p=(short*)(&a+1); //&a+1的含义是在a的地址上偏移1个a的长度,也就是8个char的长度,就是&a[8],然后把这个已经越界的地址强制转换成一个short*赋值给p(对一个数组名取地址按道理说是非法的,早期的c编译器是不允许这么做的,但是现在的编译器把这样的操作定义为值与该数组首地址相同,但类型是一个指向数组的地址,就是说&a相当于一个二维数组的地址了)
cout<<*--p<<endl;//--p就是把p减去一个short的长度,也就是2个字节,那就是&a[6],那么这时*p的含义就是把a[6]和a[7]这两个字节的内容7和8当成一个short看待,intel存储数据方式是高位在后,那么这个short的内容就是0x0807,换算成10进制就是2055
short *p=(short*)(&a+1); //&a+1的含义是在a的地址上偏移1个a的长度,也就是8个char的长度,就是&a[8],然后把这个已经越界的地址强制转换成一个short*赋值给p(对一个数组名取地址按道理说是非法的,早期的c编译器是不允许这么做的,但是现在的编译器把这样的操作定义为值与该数组首地址相同,但类型是一个指向数组的地址,就是说&a相当于一个二维数组的地址了)
cout<<*--p<<endl;//--p就是把p减去一个short的长度,也就是2个字节,那就是&a[6],那么这时*p的含义就是把a[6]和a[7]这两个字节的内容7和8当成一个short看待,intel存储数据方式是高位在后,那么这个short的内容就是0x0807,换算成10进制就是2055
追问
“但是现在的编译器把这样的操作定义为值与该数组首地址相同,但类型是一个指向数组的地址,就是说&a相当于一个二维数组的地址了”这句话怎么理解啊?是说&a指向的是一个一维数组的首地址吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询