一道C++的题的解答

来源:百度知道 编辑:UC知道 时间:2024/06/23 04:43:08
下面的C代码在VC++6.0下的运行结果是什么?请哪位高手详细说明原因。 谢谢了!
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}

第一个是a[4],也就是5,因为(&a+1)的加1是加了一个"&a"类型的大小,也就是a[5]的大小;
第二个是200000,现在机器上int和long是一样的,都是4字节,而内存变量的存放规则是低位在低地址、高位在高地址,
a[5]数组在内存中为“01 00 00 00 02 00 00 00 03 00 00 00……”
(int *)((int )a+1),是把指针a的值加了一个1,因为做的加法是整型变量的加法,所以指针值加的就是一个1,于是将要输出的变量就是“00 00 00 02”,输出就是200000了,以上所讲都是十六进制。

第一个是5 第二个不确定(是错误的用法)
&a+1返回的是a[5](一个越界的值)转化为int*后减一就是a[4]的值5了

第一个为5,也就是a[4];比较好解释。
第二个为2000000,是确定的,前面那位说错了,如果不信可以把a[1]换成其它数字试一下,原因也没搞懂。a应该是一个long型的,在(int)的时候转变应该也没什么问题的,int和long在我机子上应该是一样的,但它强制转换以后再加上就跟原来不一样了。不懂

5,2000000