|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
C++论坛
→
『 C++教室 』
→ 指针类型修饰符的强制类型转换
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
1728
人关注过本帖,
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
举报帖子
使用道具
赠送鲜花
尝鲜
等 级:
论坛游民
帖 子:24
专家分:12
注 册:2010-10-21
第
2
楼
收藏
得分: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
来 自:内蒙古包头
等 级:
贵宾
威 望:
19
帖 子:3082
专家分:11056
注 册:2010-5-22
第
3
楼
收藏
得分: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
举报帖子
使用道具
赠送鲜花
王一南
等 级:
新手上路
帖 子:29
专家分:0
注 册:2010-11-29
第
4
楼
收藏
得分:0
回复 3楼 laoyang103
谢谢你,我基本上懂了,
但是为什么&i的地址是00000001, 不是00000001 00000010, i不是占两个字节吗?
2010-12-07 23:11
举报帖子
使用道具
赠送鲜花
laoyang103
来 自:内蒙古包头
等 级:
贵宾
威 望:
19
帖 子:3082
专家分:11056
注 册:2010-5-22
第
5
楼
收藏
得分:0
在内存中 258是00000010
00000001
在没有强制转化之前&i确实是指向这以上两个字节的内存
但是强制转化了就把后面的那个字节切割掉了 所以强制转化(切割)后
&i就指向了切割剩下的那一个字节 也就是00000010
===========深入<----------------->浅出============
2010-12-08 21:39
举报帖子
使用道具
赠送鲜花
王一南
等 级:
新手上路
帖 子:29
专家分:0
注 册:2010-11-29
第
6
楼
收藏
得分:0
回复 5楼 laoyang103
(1)那它为什么不是取00000001,而是取00000010,读取内存数据不是从左往右吗?那它经过强制类型转换以后,不是应该去00000010吗?
希望你给讲解哈,谢谢
(2) 还有,我不太明白,
就是int在内存中到底占几个字节?
这个我是不太明白,因为在c里面
他好像占两个字节,但是那天又听你说整形占四个字节,
是怎么回事
[
本帖最后由 王一南 于 2010-12-9 08:56 编辑
]
2010-12-09 08:50
举报帖子
使用道具
赠送鲜花
lintaoyn
等 级:
小飞侠
威 望:
4
帖 子:606
专家分:2499
注 册:2009-4-8
第
7
楼
收藏
得分:4
short i=258;//00000001 00000010
也可能是这样的。00000010 00000001
这取决于你机器的类型。(大端机还是小端机)
(1)指针存储的地址是其指向数据的低字节地址。(你就这么理解)强转是转给编译器看的,这个操作不会改变内存里的内容。改变的是什么去解释地址里的内容。
(2)int占几个节跟你的编译器有关系。(现在一般是4个字节)
(建议下载电子版的《深入理解计算机系统》第二章还是第一章有提到。)
迭代的是人,递归的是神。
2010-12-09 10:31
举报帖子
使用道具
赠送鲜花
laoyang103
来 自:内蒙古包头
等 级:
贵宾
威 望:
19
帖 子:3082
专家分:11056
注 册:2010-5-22
第
8
楼
收藏
得分:0
栈是由高地址像低地址生长的
你这个整数进栈的时候
是先把低八位压进去后把高八位压进去
因为栈时候后进先出的数据结构
所以258在内存中就是
(低地址端)00000010 00000001(高地址端)
而指针指向的是低地址端
所以如果想切割之后剩下一个字节
那么就应该切割除了指针所指向的那个字节的 其他字节
如果不切割后面的高地址字节
那么指针就没了指向
如果还不明白
+我QQ
553069938
我语音给你讲
===========深入<----------------->浅出============
2010-12-09 12:55
举报帖子
使用道具
赠送鲜花
pangding
来 自:北京
等 级:
贵宾
威 望:
94
帖 子:6784
专家分:16751
注 册:2008-12-20
第
9
楼
收藏
得分:4
我比较支持 7楼 的说法。而且我敢肯定就是这么回事~~
哦,刚才没怎么看清楚。8楼 的只是解释的比较牵强,内存的样子倒是说对了。这个和进栈什么的没关系的。一个 int 就是4个字节也是一块进栈的。
内存字节序就是 intel 的是小尾端才会这样。
[
本帖最后由 pangding 于 2010-12-9 23:21 编辑
]
2010-12-09 23:17
举报帖子
使用道具
赠送鲜花
南国利剑
等 级:
贵宾
威 望:
29
帖 子:1165
专家分:3536
注 册:2010-4-12
第
10
楼
收藏
得分:4
7楼解释的简单明了。很好。
而8楼说的也没有错。只不过说的更接近底层硬件了。
8楼应该是搞嵌入式的吧?
南国利剑
2010-12-10 01:12
举报帖子
使用道具
赠送鲜花
12
1/2页
1
2
快速回复:
指针类型修饰符的强制类型转换
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.025923 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved