免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lc1999
打印 上一主题 下一主题

[C] 考试题C语言.请教. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-11-03 13:19 |只看该作者
struct s* get_s_ptr(int * a_ptr)
{
    return (struct s*)((void*)a_ptr-(int)(&((struct s*)0)->a));
}
为什么要将a_ptr变为void *,然后还要和一个int来减?

论坛徽章:
0
12 [报告]
发表于 2005-11-03 13:34 |只看该作者
原帖由 baibai1983 于 2005-11-3 13:19 发表
struct s* get_s_ptr(int * a_ptr)
{
    return (struct s*)((void*)a_ptr-(int)(&((struct s*)0)->a));
}
为什么要将a_ptr变为void *,然后还要和一个int来减?


唉,看来偶得去学学怎么讲故事了。。。

(struct s*)0  :找到尺子,把尺子的一条边卡在头顶上。
((struct s*)0)->a)  : 找到眼睛。
(int)(&((struct s*)0)->a))  : 记录下眼睛“看到”的刻度,即眼睛离头顶的距离。

省下的就是指针减法了。“为什么要将a_ptr变为void *”,想一想对一个指针进行
加减的时候,怎么就知道步长该是多少呢?

[ 本帖最后由 雨丝风片 于 2005-11-3 13:42 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2005-11-03 14:06 |只看该作者
原帖由 雨丝风片 于 2005-11-3 13:34 发表


唉,看来偶得去学学怎么讲故事了。。。

(struct s*)0  :找到尺子,把尺子的一条边卡在头顶上。
((struct s*)0)->a)  : 找到眼睛。
(int)(&((struct s*)0)->a))  : 记录下眼睛“看到”的刻 ...


这个故事比较动听。

论坛徽章:
0
14 [报告]
发表于 2005-11-03 14:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
15 [报告]
发表于 2005-11-03 14:38 |只看该作者
改成这样也许更好理解些,呵呵
struct s* get_s_ptr(int * a_ptr)
{
    return (struct s*)((void*)a_ptr-(int)(&((struct s*)0x00000000)->a));
}

论坛徽章:
0
16 [报告]
发表于 2005-11-03 14:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
17 [报告]
发表于 2005-11-03 14:50 |只看该作者
我的意思是改成0x00000000可以让代码看上去更容易理解些。至少0x00000000看上去比0更象内存地址。虽然表示的是同一个意思。

个人建议,仅做参考

[ 本帖最后由 小雨加雪 于 2005-11-3 14:51 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2005-11-03 15:44 |只看该作者
看不懂什么意思,差距啊~

论坛徽章:
0
19 [报告]
发表于 2005-11-03 15:54 |只看该作者

回复 12楼 雨丝风片 的帖子

雨丝风片 解释的很生动呀 呵呵
((void*)a_ptr-(int)(&((struct s*)0x00000000)->a);  
不过希望那个大牛再说说为什么做差,而不是这样做和
((void*)a_ptr+(int)(&((struct s*)0x00000000)->a);
这是不是和机器的数据存储顺序有关,专业词汇忘了怎么说 :)
程序移植是不是要考虑这个问题呀?

[ 本帖最后由 redog 于 2005-11-3 16:02 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2005-11-03 16:15 |只看该作者
原帖由 zalem 于 2005-11-3 07:30 发表
struct s* get_s_ptr(int * a_ptr)
{
    return (struct s*)((void*)a_ptr-(int)(&((struct s*)0)->a));
}


由于 void 是一种不完整类型,所以不要对 void 指针(void*)进行加减运算。因此,程序中的 void* 改为 char* 会更合适些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP