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

解决方案 »

  1.   

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

  2.   

    这个和 平台有关对于 PC x86的系统来讲,是LBA,也就是说 0xFFFFFFF7 排列是 F7 FF FF FF,所以 &a 指向的是 F7。如果换环境,比如 MCU,DSP 或者 MIPS 等,他们都是 MBA 的,FF FF FF F7,&a 会指向第一个 FF。
      

  3.   


    在内存里有一些数据,如 0xFFFFFFF7
    现在用两种类型的指针去读取:1、整型指针2、字符指针
    它们虽然读取一个地方的数据,但读取的长度不同:1、整型指针 一次 读 4 个字节的内容2、字符指针 一次 只读 1 个字节的内容注意:这里存在一个高低地址的问题,但道理是这个。
    上面是我的理解,如果问题,欢迎 PK 
      

  4.   

    指针都一样,都是四字节,指针等于指针没错。关键是你要取里面的内容时就要注意了!!
    printf("%8x",*b);只取了1个字节的数据,而实际上是4字节的!!
      

  5.   

    要想保证不出错, 转换之前先判断该int的大小,
    如果已经超过char的范围, 另做处理 .
      

  6.   

    上面先抢个沙发,下面在来详细解释一下:
    比如下面的内存结构:
         地址     值
        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
      

  7.   


    int a=0;
    char *b=(char *)&a;
    这并不是把四个字节转换成一个字节啊,
    这句话的作用只是将一个int类型变量的首地址赋值给一个char类型的指针变量.
    赋值过后b里面存的是地址啊,不要以为它是数据.
      

  8.   

    我想问,为什么print出来的是4个字节的数据?不是1个字节的呢?
      

  9.   

    据说是因为printf函数的问题,进行了扩展