int a={1,2,3,4}; int *p=(int *)((int)a+1); P指向了什么?

 我来答
馒头上线了
2015-10-10 · TA获得超过221个赞
知道小有建树答主
回答量:162
采纳率:66%
帮助的人:88.9万
展开全部
1. int a = {}; 貌似应该是int a[] = {};
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为M,那么访问指针指向的元素其实就是M[(int)p]。在对指针本身做加减法的时候,如果增加或者减小到的值为1,那么系统其实默认的得到的指针值是 p + sizeof(T) * 1,这里你吧a转换成了一个整数,并取得了该整数加1的值,其实你的到的是p + 1,所以p的指向就向前移动了一个字节,指向了a【0】的第二个字节的地址。
李磊_1
2012-11-08 · TA获得超过299个赞
知道小有建树答主
回答量:337
采纳率:66%
帮助的人:120万
展开全部
你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为M,那么访问指针指向的元素其实就是M[(int)p]。在对指针本身做加减法的时候,如果增加或者减小到的值为1,那么系统其实默认的得到的指针值是 p + sizeof(T) * 1,这里你吧a转换成了一个整数,并取得了该整数加1的值,其实你的到的是p + 1,所以p的指向就向前移动了一个字节,指向了a【0】的第二个字节的地址。
其实指针的这种特性会经常使用在同种类型值需要不同解释的情况,比如要判断机器的大小端(大小端可以上网查询),你可以定义一个共用体:
union {
int ele;
}hl;

在程序中你可以初始化:
hl.ele = 0;

然后你再定义一个字符型指针:
char *p = hl.ele[0];

你就可以通过(*p)的值判断机器的大小端了。
追问
我还是无法理解为什么(int)a这个表达式是取得一个字节,而不能看成是一个强制转换呢?
追答
a本身是一个指针,但在这里你把它转换成了一个整形值了,所以在这里a+1就是a+1,是按照整形的加法进行的,但是指针的加法是在你加的数字基础上再乘上指针指向的类型所占的字节,就是n*sizeof(T)。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
noMoreThan5
2012-11-08 · 超过18用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:46.5万
展开全部
1. int a = {}; 貌似应该是int a[] = {};
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2ff26f4
2012-11-08 · TA获得超过219个赞
知道小有建树答主
回答量:172
采纳率:100%
帮助的人:107万
展开全部
2
更多追问追答
追问
如果输出是2,程序是这样写的int *p=(int *)(a+1);我看了下(int)a+1指向的是a【0】的第二个字节的地址,这个我就不能理解了
追答
a[0]不是只有一个字节吗,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式