| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1728 人关注过本帖, 1 人收藏
标题:指针类型修饰符的强制类型转换
只看楼主 加入收藏
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:11 
指针类型修饰符的强制类型转换
      大家好
   short i=258;//00000001 00000010
   char *p=(char *)&i;
   cout<<endl<<int(*p)<<int(*(p+1));
  结果输出的是  21
    这个程序我不明白, 谁给我详细解释哈  谢谢
搜索更多相关主题的帖子: 指针 类型 
2010-12-07 12:16
尝鲜
Rank: 2
等 级:论坛游民
帖 子:24
专家分:12
注 册:2010-10-21
收藏
得分:4 
short i=258;//00000001 00000010
   char *p=(char *)&i;
   cout<<endl<<int(*p)<<int(*(p+1));。。。。。。。。
cout<<int(*p)<<int(*(p+1))<<endl;
short 两个字节,char 一个字节
p指向的是字符型的,258在内存中是 0002 0001 (16)
假设&i=0xxxxxxxxx 那么p=0xxxxxxxxx 对应 0002 :p+1=(0xxxxxxxxx+1) 对应0001
*p=0002 *(p+1)=0001
打印出的只是*p *(p+1)的ASCII值而已。。。
2010-12-07 13:19
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:4 
cout<<int(*p)<<int(*(p+1))<<endl;
首先258的二进制数确实是这样的00000001 00000010
但是在内存中低八位是在前面高八位在后面(因为栈是又高地址像低地址生长的)
所以在内存中 258就是00000010  00000001
&i存的是低八位字节的地址也就是00000010  当你把它转化成字符类型也就是
一个字节的时候  就会把高八位切割掉
那么  00000010 也就是十进制的2
同理p+1也就指向了00000001内存单元那么这个显然是1
如果没有int(*p)<<int(*(p+1))那么输出来的将会是2和1所代表ASCII码字符
我输出来好像是两个笑脸  反正道理明白就行了

                                         
===========深入<----------------->浅出============
2010-12-07 17:29
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
收藏
得分:0 
回复 3楼 laoyang103
谢谢你,我基本上懂了,  但是为什么&i的地址是00000001, 不是00000001 00000010, i不是占两个字节吗?
2010-12-07 23:11
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
在内存中 258是00000010  00000001
在没有强制转化之前&i确实是指向这以上两个字节的内存
但是强制转化了就把后面的那个字节切割掉了 所以强制转化(切割)后
&i就指向了切割剩下的那一个字节 也就是00000010

                                         
===========深入<----------------->浅出============
2010-12-08 21:39
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
收藏
得分:0 
回复 5楼 laoyang103
(1)那它为什么不是取00000001,而是取00000010,读取内存数据不是从左往右吗?那它经过强制类型转换以后,不是应该去00000010吗?  希望你给讲解哈,谢谢

 (2) 还有,我不太明白,  就是int在内存中到底占几个字节?  这个我是不太明白,因为在c里面  他好像占两个字节,但是那天又听你说整形占四个字节,  是怎么回事

[ 本帖最后由 王一南 于 2010-12-9 08:56 编辑 ]
2010-12-09 08:50
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:4 
short i=258;//00000001 00000010
也可能是这样的。00000010 00000001
这取决于你机器的类型。(大端机还是小端机)
(1)指针存储的地址是其指向数据的低字节地址。(你就这么理解)强转是转给编译器看的,这个操作不会改变内存里的内容。改变的是什么去解释地址里的内容。
(2)int占几个节跟你的编译器有关系。(现在一般是4个字节)
(建议下载电子版的《深入理解计算机系统》第二章还是第一章有提到。)

迭代的是人,递归的是神。
2010-12-09 10:31
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
栈是由高地址像低地址生长的
你这个整数进栈的时候   是先把低八位压进去后把高八位压进去
因为栈时候后进先出的数据结构
所以258在内存中就是         (低地址端)00000010 00000001(高地址端)
而指针指向的是低地址端  所以如果想切割之后剩下一个字节
那么就应该切割除了指针所指向的那个字节的 其他字节
如果不切割后面的高地址字节  那么指针就没了指向
如果还不明白  +我QQ  553069938   我语音给你讲

                                         
===========深入<----------------->浅出============
2010-12-09 12:55
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:4 
我比较支持 7楼 的说法。而且我敢肯定就是这么回事~~

哦,刚才没怎么看清楚。8楼 的只是解释的比较牵强,内存的样子倒是说对了。这个和进栈什么的没关系的。一个 int 就是4个字节也是一块进栈的。
内存字节序就是 intel 的是小尾端才会这样。

[ 本帖最后由 pangding 于 2010-12-9 23:21 编辑 ]
2010-12-09 23:17
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:4 
7楼解释的简单明了。很好。

而8楼说的也没有错。只不过说的更接近底层硬件了。
8楼应该是搞嵌入式的吧?

南国利剑
2010-12-10 01:12
快速回复:指针类型修饰符的强制类型转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036442 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved