免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 21684 | 回复: 132
打印 上一主题 下一主题

苦思冥想,关于【指针类型强制转换】的问题,求解! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-15 21:04 |只看该作者 |倒序浏览
本帖最后由 warmofice 于 2012-06-15 21:33 编辑

        先看代码:
                   unsigned char arr[2] = {0xffff0101,0x00000001};  
                    
                   printf("%d\n",  *((char *)&(arr[0])));
                   printf("%d\n",  *((int *)&(arr[0])));
      
         运行结果:
                   1
                   257

         上文我能理解,知道指针类型决定了  *(指针)的值得取值范围。但是下文,我就不理解了。
                   unsigned int a = 0xfffffff7;
        
                   printf("%x\n", *((int   *)&a));
                   printf("%x\n", *((char *)&a));
          运行结果:
                    0xfffffff7
                    0xfffffff7
-----------------------------------------------------------------------
         我不明白指针的类型是什么意思,我明白指针其实就是一个32位的整数,以前这么认为
         比如:unsigned char *p 的值是0x00000004,所以 *p的值就是0x00000004的【值也也就是这个地址的8位二进制的和】;
         比如:unsigned int *p的值是0x00000004,所以 *p的值就是0x00000004【开始的4个字节的二进制的和】;

         而我发现,许多书上写的是,指针类型的转换只是影响的指针的寻址,不影响指针值,我迷惑了!希望有人来回答!

         到底指针类型表示着什么?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
2 [报告]
发表于 2012-06-15 21:09 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2012-06-15 21:16 |只看该作者
printf(, *((char *)&a));
pls use printf("%c\n",

assume there are the following code
char [1111]="%x\n";
printf(fmthex,*((char *)&a));
fmthex[1]='c';
printf(fmthex,*((char *)&a));

now you may understand what happy: the compiler doesn't know which type be transport into the function "printf";
which is parsed by the function "printf" itself. and the compiler can't (some compiler can do a few check about function printf & scanf)
understand what happen about the first parameter of printf( which be understand as a formating string).
while use printf, it is your duty to make the program acts right.

wish it helps, thks

论坛徽章:
0
4 [报告]
发表于 2012-06-15 21:19 |只看该作者
回复 2# pmerofc


    首先,我尊重你的回答,但是我觉得你只说不对,却不说或者说不出为什么,我表示很无奈!还有,那代码是我经过测试,没问题的,书上原题,是《面试宝典3》里面类型转换的第一道题!5.4,34页。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2012-06-15 21:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2012-06-15 21:32 |只看该作者
回复 3# folklore


    首先感谢你的回答,一方面羡慕你的英文水平,一方面很感谢你的耐心回答。

    我大概是明白你的意思,也有可能是理解不对,你的意思是printf函数是需要指定输出的格式。编译器有的时候不知道是什么格式。

    但是在第二段代码的都是printf(“%d”,。。。),却输出的不都是一个字节的值,我不理解的其实仅仅是这点。。。char类型的指针输出一个字节的值,而int类型的指针却输出的是4个字节的值。我很不理解呀~~~

论坛徽章:
0
7 [报告]
发表于 2012-06-15 21:37 |只看该作者
回复 5# pmerofc


    你若觉得是垃圾,未必我觉得是垃圾,像你说的我基础差,所以我觉得不垃圾。

    与其吐槽,你不如告诉我提的问题在哪里。OK?你说的明明白白,那我佩服你,不过你还是不回答问题,我只能说很无奈啊~

论坛徽章:
0
8 [报告]
发表于 2012-06-15 21:42 |只看该作者
回复 5# pmerofc


    比如:unsigned char *p 的值是0x00000004,所以 *p的值就是0x00000004的【值也也就是这个地址的8位二进制的和】;
    比如:unsigned int *p的值是0x00000004,所以 *p的值就是0x00000004【开始的4个字节的二进制的和】;

     希望你不要吐槽了,回答我的问题。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2012-06-15 21:48 |只看该作者
回复 6# warmofice


    i am sorry i am no chinese input method installed in my pc.

change

  1. printf("%x\n", *((char *)&a));
复制代码
to

  1. printf("%x\n", *((unsigned char *)&a));
复制代码
in c, the char be imps as a interger, it lead the problem that you faced.
some compiler imps the char to unsigned char
but others translating it to singed char (just as the one you have);
0xffffffff7 to char= 0xf7
pass f7 as a parament to printf,it will be changed to integer(the wordwidth of your pc).
if you compile this program into a 32 bit machine, the result is 0xfffffff7: it is 32bits
or it may be 0xfffffffffffffff7 in 64 bit prg.

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
10 [报告]
发表于 2012-06-15 21:51 |只看该作者
回复 9# folklore


    if you can't understand, try the following code

  1. printf("%x,%x",(char)0xf7,0xf7);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP