unsigned int 型的指针强制转化成一个char型的指针,不会有问题吗?

chunyou128 2008-12-18 04:17:24

#include <stdio.h>
int main()
{
unsigned int a=0xFFFFFFF7;
char *b=(char*)&a;
printf("%8x",*b);
return 0;
}

此处&a的结果应该是一个指针,它的类型取决于a的类型,此处&a的类型应该是:unsigned int *;(char*)&a不会有问题吗?从结果看是没问题,但不知道原因!
...全文
718 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
pxdbxq 2012-08-31
  • 打赏
  • 举报
回复
据说是因为printf函数的问题,进行了扩展
韭菜猫骑士 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 flydreamgg 的回复:]

指针都一样,都是四字节,指针等于指针没错。关键是你要取里面的内容时就要注意了!!
printf("%8x",*b);只取了1个字节的数据,而实际上是4字节的!!
[/Quote]
我想问,为什么print出来的是4个字节的数据?不是1个字节的呢?
shenyi0106 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chunyou128 的回复:]
引用 1 楼 shenyi0106 的回复:
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节

把四个字节强制转换成一个字节,不是有危险吗?
感觉四楼说得对!指针都一样,都是四字节
[/Quote]

int a=0;
char *b=(char *)&a;
这并不是把四个字节转换成一个字节啊,
这句话的作用只是将一个int类型变量的首地址赋值给一个char类型的指针变量.
赋值过后b里面存的是地址啊,不要以为它是数据.
jyh_baoding 2008-12-18
  • 打赏
  • 举报
回复
应该不会出错,但结果可能不是你预期的
chunyou128 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenyi0106 的回复:]
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节
[/Quote]
把四个字节强制转换成一个字节,不是有危险吗?
感觉四楼说得对!指针都一样,都是四字节
shenyi0106 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chunyou128 的回复:]
引用 1 楼 shenyi0106 的回复:
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节

把四个字节强制转换成一个字节,怎么才能保证不会出错呢?
[/Quote]
四个字节转换成一个字节,你怎么转都不会出错,只要你确认数据没有问题就行.
fandh 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zaodt 的回复:]

在内存里有一些数据,如 0xFFFFFFF7


现在用两种类型的指针去读取:

1、整型指针

2、字符指针


它们虽然读取一个地方的数据,但读取的长度不同:

1、整型指针 一次 读 4 个字节的内容

2、字符指针 一次 只读 1 个字节的内容


注意:这里存在一个高低地址的问题,但道理是这个。


上面是我的理解,如果问题,欢迎 PK
[/Quote]

我觉得这样理解可以!
shenyi0106 2008-12-18
  • 打赏
  • 举报
回复
上面先抢个沙发,下面在来详细解释一下:
比如下面的内存结构:
地址 值
0x1234 0
0x1235 0
0x1236 0
0x1237 0

假设
int a=0;
就是如上所述的结构
那么
char *b=(char*)&a;
其实就是将b指向0x1234的位置,b+1=0x1235,b+2=0x1236,.....
如果编译器检查不是那么严格的话,你甚至可以这么写:
void * p=&a;
也就是说(char*)&a中的(char *)只是为了满足编译器的类型检查而已,最终&a的第一个字节的地址都赋值给b
zhucde 2008-12-18
  • 打赏
  • 举报
回复
要想保证不出错, 转换之前先判断该int的大小,
如果已经超过char的范围, 另做处理 .
liumeiqinyang 2008-12-18
  • 打赏
  • 举报
回复
有办法保证不出错吗?
chunyou128 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenyi0106 的回复:]
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节
[/Quote]
把四个字节强制转换成一个字节,怎么才能保证不会出错呢?
昨夜无风 2008-12-18
  • 打赏
  • 举报
回复
指针都一样,都是四字节,指针等于指针没错。关键是你要取里面的内容时就要注意了!!
printf("%8x",*b);只取了1个字节的数据,而实际上是4字节的!!
zaodt 2008-12-18
  • 打赏
  • 举报
回复

在内存里有一些数据,如 0xFFFFFFF7


现在用两种类型的指针去读取:

1、整型指针

2、字符指针


它们虽然读取一个地方的数据,但读取的长度不同:

1、整型指针 一次 读 4 个字节的内容

2、字符指针 一次 只读 1 个字节的内容



注意:这里存在一个高低地址的问题,但道理是这个。




上面是我的理解,如果问题,欢迎 PK
碧螺春的马甲 2008-12-18
  • 打赏
  • 举报
回复
这个和 平台有关

对于 PC x86的系统来讲,是LBA,也就是说 0xFFFFFFF7 排列是 F7 FF FF FF,所以 &a 指向的是 F7。

如果换环境,比如 MCU,DSP 或者 MIPS 等,他们都是 MBA 的,FF FF FF F7,&a 会指向第一个 FF。
shenyi0106 2008-12-18
  • 打赏
  • 举报
回复
&a是个地址,而char *b是个指针,用指针指向地址何错只有?
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧