楚门 发表于 2012-5-22 21:36:33

看看这个小程序(考验你指针能力的时候了,挺有意思的)

本帖最后由 楚门 于 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 *****

乘风追日 发表于 2012-5-22 21:53:57

猜猜,是1,2么?

乘风追日 发表于 2012-5-22 21:55:08

凌乱了:Q

楚门 发表于 2012-5-22 21:55:12

乘风追日 发表于 2012-5-22 21:53 static/image/common/back.gif
猜猜,是1,2么?

额。。   

qxxgcc 发表于 2012-5-22 22:03:47

12121212121212121212121212

Near 发表于 2012-5-22 22:11:51

本帖最后由 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了

楚门 发表于 2012-5-22 22:29:34

Near 发表于 2012-5-22 22:11 static/image/common/back.gif
输出是5,2000000
第一个是先将a(假如有的话)的地址赋给ptr1,最后再使ptr-1,得到a的地址,输出就 ...

嘻嘻,bingo!!!赞一个

Near 发表于 2012-5-22 22:32:01

楚门 发表于 2012-5-22 22:29 static/image/common/back.gif
嘻嘻,bingo!!!赞一个

嘿嘿{:2_31:}

mx__sword 发表于 2012-5-22 22:40:56

为什么是这个结果额

楚门 发表于 2012-5-22 22:44:02

mx__sword 发表于 2012-5-22 22:40 static/image/common/back.gif
为什么是这个结果额

看看6楼的解释:lol

廿文廿武 发表于 2012-5-23 01:43:15

我完全没看出来....................................:funk:

teller306 发表于 2012-5-23 09:23:21

看答案存储数据的方式

粉墨登場 发表于 2012-5-23 09:54:28

我是VIP了木有??

琦域之巅Plus 发表于 2012-5-23 09:57:09

好吧,我指针真不咋地:'(

琦域之巅Plus 发表于 2012-5-23 10:01:16

第一个还行,话说神马事小端大端。。。

tnred 发表于 2012-5-23 10:34:57

来看看答案呢~

唯舆之缌 发表于 2012-5-23 10:55:48

感谢小甲鱼
:o本贴由隐藏贴回复机快速回复

玩酷子弟lv 发表于 2012-5-23 11:00:48

5,2000000
看看对不对

剑蝶 发表于 2012-5-23 13:24:35

...................................................................

流久动 发表于 2012-5-23 13:25:57

比试我是菜鸟,看不懂
页: [1] 2 3 4 5 6
查看完整版本: 看看这个小程序(考验你指针能力的时候了,挺有意思的)