看看这个小程序(考验你指针能力的时候了,挺有意思的)
本帖最后由 楚门 于 2012-5-22 22:19 编辑废话少说,源码奉上#include <stdio.h>
int main(void)
{
int a={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
请问输出是什么?大家先自己想想,答案先隐藏了
(注:这题答案对内存存储数据的方式(即大端模式和小端模式)不同而不同,这里给出的是小端模式的答案)
**** Hidden Message *****
猜猜,是1,2么? 凌乱了:Q 乘风追日 发表于 2012-5-22 21:53 static/image/common/back.gif
猜猜,是1,2么?
额。。 12121212121212121212121212 本帖最后由 Near 于 2012-5-22 22:24 编辑
输出是5,2000000
第一个是先将a(假如有的话)的地址赋给ptr1,最后再使ptr-1,得到a的地址,输出就是5
第二个比较有意思,通过(int)a+1将a的地址变成整型后加1,即。然后在转换成(int *)型的地址传递给ptr2
因为int型是占四个字节,而且x86cpu默认为小端存储,则实际存储形式是01 00 00 00 02 00 00 00 03 00 00.....a的地址是01的地址,所以取值为00 00 00 01 。同理,ptr2的地址是01后的00那个地址,则其取值为02 00 00 00,所以打出的值就是2000000了
Near 发表于 2012-5-22 22:11 static/image/common/back.gif
输出是5,2000000
第一个是先将a(假如有的话)的地址赋给ptr1,最后再使ptr-1,得到a的地址,输出就 ...
嘻嘻,bingo!!!赞一个 楚门 发表于 2012-5-22 22:29 static/image/common/back.gif
嘻嘻,bingo!!!赞一个
嘿嘿{:2_31:} 为什么是这个结果额 mx__sword 发表于 2012-5-22 22:40 static/image/common/back.gif
为什么是这个结果额
看看6楼的解释:lol 我完全没看出来....................................:funk: 看答案存储数据的方式 我是VIP了木有?? 好吧,我指针真不咋地:'( 第一个还行,话说神马事小端大端。。。 来看看答案呢~ 感谢小甲鱼
:o本贴由隐藏贴回复机快速回复 5,2000000
看看对不对 ................................................................... 比试我是菜鸟,看不懂