青山梦好 发表于 2012-5-23 13:36:40

{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}

.忧郁dё訷 发表于 2012-5-23 13:53:26

0000001,0000002

无脑仔工作室 发表于 2012-5-23 14:47:47

{:5_107:}{:5_107:}

惜似水流年 发表于 2012-5-23 14:48:32

dddddddddddddddddddddddd

枫幻 发表于 2012-5-23 16:07:18

看看
{:5_102:}{:5_102:}

云端漫步 发表于 2012-5-23 16:22:15

{:1_1:}{:1_1:}

越野e族 发表于 2012-5-23 16:29:07

来看看,想了想,有点头绪了

自由的心 发表于 2012-5-23 16:47:03

看看答案是多少

翠竹 发表于 2012-5-23 17:23:08

赞一个!{:5_109:}

可里@天意社区 发表于 2012-5-23 22:11:18

呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜

方丈 发表于 2012-5-23 22:15:28

貌似没看错的话 题目出自AOGO论坛吧

楚门 发表于 2012-5-23 22:19:37

方丈 发表于 2012-5-23 22:15 static/image/common/back.gif
貌似没看错的话 题目出自AOGO论坛吧

我从《C语言 深度剖析》这本书上看到的

神的现身 发表于 2012-5-23 22:35:16

凌乱看不明

神品江湖 发表于 2012-5-24 00:00:49

seeeeeeeeeee

无脑仔工作室 发表于 2012-5-24 09:18:27

本帖最后由 无脑仔工作室 于 2012-5-24 09:20 编辑

#include <stdio.h>
int main(void)
{
      int i;
      char *pp;
    int a={1,2,3,4,5};//该数组换成7来对比
      //int a={1,2,3,4,5,6,7};//该数组换成7来对比
    int *ptr1=(int *)(&a+1);
      //int *ptr11=&a;该句错误 cannot convert from 'int (*)' to 'int *'
      //说明&a是int(*)类型 对其加1 就是 a=a+sizeof(int(*));也就是整个数组的长度
      //此时指针已经指向第六个元素(后面输出才会-1)
      //所以才会出现最后一行输出最后一个数
      
      //数组内部保存情况:    00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05
      //一般情况指针指向低位:            |//指向1
      //实现++后                                                          | //它是根据sizeof(int)来判断的指向2
      int *ptr2=(int *)((int)a+1);//为什么会输出200000
      //数组内部保存情况:    00 00 00 01 / 00 00 00 02 / 00 00 00 03 / 00 00 00 04 / 00 00 00 05
      //默认指针指向:                            |(int)a 把a的地址转换成整形
      //实现+1后(int)a+1                              | //指向1后面的0
      //所以就是对00 00 00 02的输出,因为编译器对(int *)内部就已经对数组进行划分
      //而00 00 00 02的输出(这个在小甲鱼的汇编语言中好像有它的存储结构)
      // 12 56 89 36 -->>
      // 12 56 89 36 -->>12 56 | 89 36
      // 56 12 36 89 -->>56 12 | 36 89
      // 36 89 12 56 //输出的结果


      int *ptr11=(int *)&a;
      int *ptr12=a+1;


      printf("\n");
      pp=(char *)a;
      for(i=0;i<sizeof(a);i++)
                printf("%d ",*(pp+i));

      printf("\n");
      
      printf("a1==%p\n",a);
      printf("*p1==%p\n",ptr1);
      printf("*p11=%p\n",ptr11+1);
      printf("*p12=%p\n",ptr12);
      printf("*p[-1]=%p\n",ptr1[-1]);
    printf("*p=%p,%x\n",ptr2,*ptr2);
   
   
    printf("%x,%x\n",ptr1[-1],*ptr2);
    //对于ptr1[-1]的说明[]就是*(指针)的逆运算ptr1[-1]---> *(ptr1)-1
    return 0;
}

/*
输出结果
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0
a1==0012FF64
*p1==0012FF78
*p11=0012FF68
*p12=0012FF68
*p[-1]=00000005
*p=0012FF65,2000000
5,2000000
*/

//这道题我花了1个多小时才基本弄明白,不过很值得。很多问题只要多动手,多百度,花上一两小时就算弄不懂,也能收获很多!!加油!!!

//Ps:上面有错误的话,还请高手指点。:P

云在风中 发表于 2012-5-26 13:17:50

cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

jianxingangel 发表于 2012-5-28 17:20:45

没有看懂、

一杯沧海 发表于 2012-5-31 09:07:31

xiaocai....

Brand小坏 发表于 2012-5-31 19:53:10

看看答案                        

MC_e_e 发表于 2012-5-31 20:45:35

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