|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 请教各位关于访问某特定的内存位置的问题
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
1425
人关注过本帖
标题:
请教各位关于访问某特定的内存位置的问题
只看楼主
加入收藏
edisonwywy
等 级:
新手上路
帖 子:3
专家分:0
注 册:2010-7-13
结帖率:
100%
楼主
收藏
已结贴
√
问题点数:20 回复次数:9
请教各位关于访问某特定的内存位置的问题
在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66
典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
我想问把绝对地址赋值给整型指针ptr 可以直接ptr = 0x67a9这样不?
如果必须在绝对地址前加强制类转换(int *) 是否仅是为了给绝对地址0x67a9划分出整型量0xaa66的内存单元?
搜索更多相关主题的帖子:
内存
位置
访问
2010-07-13 12:29
举报帖子
使用道具
赠送鲜花
hao0716
等 级:
业余侠客
威 望:
1
帖 子:354
专家分:224
注 册:2006-4-11
第
2
楼
收藏
得分:15
可以直接给
但*ptr = 0xaa55;这个不是给0x67a9这个地址划分内存,而是以int的形式将0xaa55这个值写入到0x67a9这个地址里
注意大小端
2010-07-13 12:33
举报帖子
使用道具
赠送鲜花
kingsroot
等 级:
蜘蛛侠
威 望:
1
帖 子:284
专家分:1159
注 册:2010-3-28
第
3
楼
收藏
得分:5
必须要加(int*)
,
因为0x67a9是个整型数,而ptr是个指针类型,类型不一样,不能直接赋值,必须要强转
2010-07-13 12:34
举报帖子
使用道具
赠送鲜花
edisonwywy
等 级:
新手上路
帖 子:3
专家分:0
注 册:2010-7-13
第
4
楼
收藏
得分:0
楼上两位说法不一样啊
我就是不确定有没有必要在绝对地址前加 (int *)
如果不加,ptr是指针,不惯他指向什么,它存的一定是整型数啊。
如果加,也有道理啊,把ptr和绝对地址指向的类型统一。
到底怎么回事呢。。。。
2010-07-13 12:41
举报帖子
使用道具
赠送鲜花
hao0716
等 级:
业余侠客
威 望:
1
帖 子:354
专家分:224
注 册:2006-4-11
第
5
楼
收藏
得分:0
如果编不过就加,其实实际效果没有区别
只是告诉这个指针你要指到哪一个地址,然后怎么去使用
比如
int main()
{
char a[] = "123";
int* p;
int i;
p = (int*)a;
printf("%08x, %08x\n", p, a);
printf("%08x\n", *p);
for(i = 0;i < sizeof(int); i++)
printf("%02x",a[i]);
printf("\n")
;
system("PAUSE");
return 0;
}
打印就是
0012ff60, 0012ff60
00333231
31323300
可以看到指针是同一个,但是x86是小端法,所以用int打印出来的就是和字符串打印出来的是反的
也就是说类型只是如何使用的问题,只要知道了地址我们无论干什么都是可以的,额,ms有点乱,不知道你明白了没
2010-07-13 12:54
举报帖子
使用道具
赠送鲜花
hao0716
等 级:
业余侠客
威 望:
1
帖 子:354
专家分:224
注 册:2006-4-11
第
6
楼
收藏
得分:0
int main()
{
char a[] = "123";
int* p;
int i;
p = (int*)a;
printf("%08x, %08x\n", p, a);
printf("%08x\n", *p);
for(i = 0;i < sizeof(int); i++)
printf("%02x",a[i]);
printf("\n")
;
for(i = 0; i < 2; i++)
printf("%04x", *((short*)(a+i*2)));
printf("\n")
;
system("PAUSE");
return 0;
}
你可以再看看这个例子,结果是
0012ff60, 0012ff60
00333231
31323300
32310033
我的编译器是vs2005,int是4字节,short是2字节
可以看到同一段内存打印出来的东西各有不同,这就是类型的区别啦
2010-07-13 13:01
举报帖子
使用道具
赠送鲜花
hao0716
等 级:
业余侠客
威 望:
1
帖 子:354
专家分:224
注 册:2006-4-11
第
7
楼
收藏
得分:0
如果加,也有道理啊,把ptr和绝对地址指向的类型统一。
地址是没有类型的,类型是由咱们来定的
2010-07-13 13:03
举报帖子
使用道具
赠送鲜花
edisonwywy
等 级:
新手上路
帖 子:3
专家分:0
注 册:2010-7-13
第
8
楼
收藏
得分:0
你的意思是不加类型转换整型数值也能成功写入到绝对地址中,但是要正确读出的话 要么间接寻址*ptr,要么就得
(int*)0x67a9才能完整读出数据0xaa66,
2010-07-13 13:11
举报帖子
使用道具
赠送鲜花
hao0716
等 级:
业余侠客
威 望:
1
帖 子:354
专家分:224
注 册:2006-4-11
第
9
楼
收藏
得分:0
ptr = (int *)0x67a9;
这个我说直接给是错误的,编不过去,总之你强制转换吧,是没错的
2010-07-13 13:44
举报帖子
使用道具
赠送鲜花
forever74
来 自:CC
等 级:
版主
威 望:
58
帖 子:1706
专家分:4350
注 册:2007-12-27
第
10
楼
收藏
得分:0
强制类型转换是为了严谨
不加这个转换,程序可能正确
加上这个转换,程序肯定正确
对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-07-13 15:53
举报帖子
使用道具
赠送鲜花
10
1/1页
1
快速回复:
请教各位关于访问某特定的内存位置的问题
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.024406 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved