鱼C论坛

 找回密码
 立即注册
查看: 2231|回复: 4

关于指针的问题

[复制链接]
发表于 2014-3-20 21:25:38 | 显示全部楼层 |阅读模式
5鱼币
#include < stdio.h >
void main( )
{
        char a[10]={0,1,2,3,4,5,6,7,8,9};
        int*ptr = a;
        printf("%d\n", *ptr);
}
为什么输出的不是0,指向的不是这片区域的首地址吗?
十分感谢!

最佳答案

查看完整内容

虽然内存中有那些数据 但是 char 1字节 vs系列 int 4字节 他们在内存的解释不同 你可以强制转换 int *ptr = (int *)a; 但是打印的结果是50462976 你把它准换成16进制看看 是多少 3020100就是你的数组的前4个字节, 如果你非要这么用 那么把int* 改成char* 或者byte* 反正1个字节的类型 就可以用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-20 21:25:39 | 显示全部楼层
虽然内存中有那些数据 但是 char 1字节 vs系列 int 4字节 他们在内存的解释不同
你可以强制转换 int *ptr = (int *)a;
但是打印的结果是50462976 你把它准换成16进制看看 是多少 3020100就是你的数组的前4个字节,
如果你非要这么用 那么把int* 改成char* 或者byte* 反正1个字节的类型 就可以用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-20 21:49:22 | 显示全部楼层
完全没必要为了这种问题而蛋疼。。。。。。。这种问题。。。。一般就呵呵。。过了就好。。。
刚才试了一下。。。。在VS2010显示error了。char *类型的值不能赋值于int *类型的实体。。你用的
VC6吧?  这个是编译器的问题。。和c,c++语法没关系的。。要看。。编译器怎么实现。。
既然是编译器的问题。。。那就不是问题。。因为完全没有探讨的必要。。。你也不必要去弄清楚
因为没有答案。。编译器不同。。答案不同。。。。。只想知道的话。。。那就只有基于编译器。。自己太欧式。。。了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-20 22:07:29 | 显示全部楼层
本帖最后由 超级忍者龟 于 2014-3-20 22:09 编辑

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

评分

参与人数 1鱼币 +3 收起 理由
飞驰吧!少年 + 3 很不错

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-21 10:12:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表