鱼C论坛

 找回密码
 立即注册
楼主: 楚门

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

  [复制链接]
发表于 2012-5-23 13:36:40 | 显示全部楼层
{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 13:53:26 | 显示全部楼层
0000001,0000002
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 14:47:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 14:48:32 | 显示全部楼层
dddddddddddddddddddddddd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 16:07:18 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 16:22:15 | 显示全部楼层
{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 16:29:07 | 显示全部楼层
来看看,想了想,有点头绪了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 16:47:03 | 显示全部楼层
看看答案是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 17:23:08 | 显示全部楼层
赞一个!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 22:11:18 | 显示全部楼层
呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 22:15:28 | 显示全部楼层
貌似没看错的话 题目出自AOGO论坛吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-5-23 22:19:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-23 22:35:16 | 显示全部楼层
凌乱看不明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-24 00:00:49 | 显示全部楼层
seeeeeeeeeee
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-24 09:18:27 | 显示全部楼层
本帖最后由 无脑仔工作室 于 2012-5-24 09:20 编辑

#include <stdio.h>
int main(void)
{
        int i;
        char *pp;
    int a[5]={1,2,3,4,5};//该数组换成7来对比
        //int a[7]={1,2,3,4,5,6,7};//该数组换成7来对比
    int *ptr1=(int *)(&a+1);
        //int *ptr11=&a;该句错误 cannot convert from 'int (*)[7]' to 'int *'
        //说明&a是int(*)[7]类型 对其加1 就是 a=a+sizeof(int(*)[7]);也就是整个数组的长度
        //此时指针已经指向第六个元素(后面输出才会-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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-26 13:17:50 | 显示全部楼层
cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-28 17:20:45 | 显示全部楼层
没有看懂、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-31 09:07:31 | 显示全部楼层
xiaocai....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-31 19:53:10 | 显示全部楼层
看看答案                        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-31 20:45:35 | 显示全部楼层
看看那         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表