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

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

#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不会有问题吗?从结果看是没问题,但不知道原因!

------解决方案--------------------
&a是个地址,而char *b是个指针,用指针指向地址何错只有?
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节
------解决方案--------------------
这个和 平台有关

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

如果换环境,比如 MCU,DSP 或者 MIPS 等,他们都是 MBA 的,FF FF FF F7,&a 会指向第一个 FF。
------解决方案--------------------

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


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

1、整型指针

2、字符指针


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

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

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



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




上面是我的理解,如果问题,欢迎 PK
------解决方案--------------------
指针都一样,都是四字节,指针等于指针没错。关键是你要取里面的内容时就要注意了!!
printf("%8x",*b);只取了1个字节的数据,而实际上是4字节的!!
------解决方案--------------------
有办法保证不出错吗?
------解决方案--------------------
要想保证不出错, 转换之前先判断该int的大小,
如果已经超过char的范围, 另做处理 .
------解决方案--------------------
上面先抢个沙发,下面在来详细解释一下:
比如下面的内存结构:
地址 值
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
------解决方案--------------------
探讨

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


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

1、整型指针

2、字符指针


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

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

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


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


上面是我的理解,如果问题,欢迎 PK

------解决方案--------------------
探讨
引用:
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节

把四个字节强制转换成一个字节,怎么才能保证不会出错呢?

------解决方案--------------------
应该不会出错,但结果可能不是你预期的
------解决方案--------------------
探讨
引用:
char *和unsigned *其实都是一样的,不同的地方是所拥有的字节数不一样,char是一个字节,而unsigned是四个字节

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