飞驰吧!少年 发表于 2014-3-20 21:25:38

关于指针的问题

#include < stdio.h >
void main( )
{
        char a={0,1,2,3,4,5,6,7,8,9};
        int*ptr = a;
        printf("%d\n", *ptr);
}
为什么输出的不是0,指向的不是这片区域的首地址吗?
十分感谢!

machimilk 发表于 2014-3-20 21:25:39

虽然内存中有那些数据 但是 char 1字节 vs系列 int 4字节 他们在内存的解释不同
你可以强制转换 int *ptr = (int *)a;
但是打印的结果是50462976 你把它准换成16进制看看 是多少 3020100就是你的数组的前4个字节,
如果你非要这么用 那么把int* 改成char* 或者byte* 反正1个字节的类型 就可以用

向往青莲 发表于 2014-3-20 21:49:22

完全没必要为了这种问题而蛋疼。。。。。。。这种问题。。。。一般就呵呵。。过了就好。。。
刚才试了一下。。。。在VS2010显示error了。char *类型的值不能赋值于int *类型的实体。。你用的
VC6吧?这个是编译器的问题。。和c,c++语法没关系的。。要看。。编译器怎么实现。。
既然是编译器的问题。。。那就不是问题。。因为完全没有探讨的必要。。。你也不必要去弄清楚
因为没有答案。。编译器不同。。答案不同。。。。。只想知道的话。。。那就只有基于编译器。。自己太欧式。。。了

超级忍者龟 发表于 2014-3-20 22:07:29

本帖最后由 超级忍者龟 于 2014-3-20 22:09 编辑

ptr指向内存a位置,ptr是整型指针,所以*ptr是4字节值,从a开始的4字节是: 0x00x10x20x3
如果你是x86平台,那就是小端,低地址存高位数据,所以排列是0x03020100,这是16进制,换成10进制值就是:50462976   。如果是大端结构,排列就是0x00010203了!
补充一句,二楼说编译器不同结果就不同是不对的,应该说是硬件体系不同结果不同,而且楼主的提问其实是非常不错的,这道题在嵌入式面试中会经常碰到,请楼主仔细学习C的内存操作!

飞驰吧!少年 发表于 2014-3-21 10:12:48

machimilk 发表于 2014-3-20 21:25 static/image/common/back.gif
虽然内存中有那些数据 但是 char 1字节 vs系列 int 4字节 他们在内存的解释不同
你可以强制转换 int *ptr...

十分感谢!
页: [1]
查看完整版本: 关于指针的问题