免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3698 | 回复: 10
打印 上一主题 下一主题

不解的指针值输出,各位帮忙解答一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-25 17:22 |只看该作者 |倒序浏览
int main(void)
{
    int *ptr = NULL;
    ptr = ptr + 15;
    printf("%x",ptr);
   
    return 0;
}

这是小弟面试时候遇到的一个问题,我回答是 0x0f, 但实际上答案是 0x3c,思来想去,不解其中缘故. 回来后在AIX uxix上面测试发现果然是 0x3c, 想不通!!!

论坛徽章:
0
2 [报告]
发表于 2007-09-25 17:38 |只看该作者
相当于 sizeof(int) * 15啊,因为 ptr 已经指明了是 int 类型的指针

ptr = (void)ptr + 15; 才是 0x0f;

论坛徽章:
0
3 [报告]
发表于 2007-09-25 17:38 |只看该作者
0x3c=60
15*4=60
32位机上
sizeof(int)=4
你如果把int*改成char *,就是你的结果了.
对于这一个问题, 有一个专门的说法, 叫做指针的步长.

论坛徽章:
0
4 [报告]
发表于 2007-09-25 17:40 |只看该作者
原帖由 hightman 于 2007-9-25 17:38 发表
相当于 sizeof(int) * 15啊,因为 ptr 已经指明了是 int 类型的指针

ptr = (void)ptr + 15; 才是 0x0f;


应该是(void*)ptr吧?

论坛徽章:
0
5 [报告]
发表于 2007-09-25 17:41 |只看该作者
谢谢各位,恍然大悟啊

论坛徽章:
0
6 [报告]
发表于 2007-09-25 17:41 |只看该作者
LZ说:果然想通了。 呵呵

论坛徽章:
0
7 [报告]
发表于 2007-09-25 17:44 |只看该作者
是啊,平时工作用的从来都是直接操作 char * 指针,用的是指针步长为1.从来没有想其他情况,自然而然的就忽略了那个 int 指针类型。

论坛徽章:
0
8 [报告]
发表于 2007-09-25 18:44 |只看该作者
原帖由 scutan 于 2007-9-25 17:40 发表


应该是(void*)ptr吧?

我记得 void 指针不支持算术运算

论坛徽章:
0
9 [报告]
发表于 2007-09-25 18:50 |只看该作者
原帖由 antigloss 于 2007-9-25 18:44 发表

我记得 void 指针不支持算术运算



可以的, 我试过的. void指针每次的步长仍然是1个字节.

论坛徽章:
0
10 [报告]
发表于 2007-09-25 18:54 |只看该作者
我用 g++ 不行,用 gcc 行。看来 C 允许这种运算,而 C++ 不允许
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP