main() {char a[8]={1,2,3,4,5,6,7,8}; short *p=(short*)(&a+1); cout<<*--p<<endl; } 程

程序运行结果为:2055;请问这个事为什么啊?... 程序运行结果为:2055;
请问这个事为什么啊?
展开
 我来答
adoqq_bd
2011-10-27 · TA获得超过7050个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1586万
展开全部
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
追问
“但是现在的编译器把这样的操作定义为值与该数组首地址相同,但类型是一个指向数组的地址,就是说&a相当于一个二维数组的地址了”这句话怎么理解啊?是说&a指向的是一个一维数组的首地址吗?
dwjchdu
2011-10-27 · TA获得超过5914个赞
知道大有可为答主
回答量:4576
采纳率:60%
帮助的人:1070万
展开全部
p是指向a+1的地址的指针,因此*p输出地是a[1]的地址.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式