问题描述:

一条晦涩难懂的C语言语句

我在一个函数中看到的

struct ylist_head *i;

struct ylist_head *n;

yaffs_Object *l;

...

//有这么一条语句

l = ylist_entry(i,yaffs_Object,siblings);

//其中siblings是结构体yaffs_Object中的成员

//这条语句调用的是一个宏,如下

#define ylist_entry(entry,type,member) \

((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))

二楼的解释得很好,但还是不太明白,我还想问,为什么要这么做呢?这么做有什么好处呢?为什么不直接将member的地址直接赋给l呢?如:l = &entry->member,希望二楼的在给予解答!

1个回答

分类:

综合

2014-12-02

问题解答:

我来补答

&((type *)NULL)->member

如果把0看作指向type的指针,那么 type::member的地址是这个

(unsigned long)(&((type *)NULL)->member)

把这个地址转成unsigned long ,因为指向整个对象的指针本身是0,所以这个值实际上就是member 这个成员在结构里的位置偏移量

(char*)(entry)就是为了让它在加减1的时候内存地址实际上也是加减1

(char*)(entry) - (unsigned long)(&((type *)NULL)->member)

就是从entry这个位置减去member的偏移量.

它的意义是:如果entry是指向某个type结构对象的member成员的指针,那么这个结果就是这个结构对象0偏移位置的指针,也就是指向这个对象整体的指针.

外头再加个类型转换就很容易理解了,因为里头算出来的就是指向整个对象的指针,所以也就转换成type*

总的来说,如果 entry是指向某个type类型对象的member成员的指针,这个宏可以求得指向这个对象的指针

展开全文阅读

c 语言的15个晦涩,一条晦涩难懂的C语言语句相关推荐

  1. 水仙花亲密数c语言,★2015年3月15日江苏省高校计算机等级考试二级C语言1套上机题(C01)及其解答_张柏雄.doc...

    ★2015年3月15日江苏省高校计算机等级考试二级C语言1套上机题(C01)及其解答_张柏雄 目录 C01(上午8:00-9:10)原题 解答 附录:通用的自编函数 2015春江苏省高校计算机二级C语 ...

  2. Xamarin XAML语言教程使用属性设置进度条的当前进度

    Xamarin XAML语言教程使用属性设置进度条的当前进度 在图12.19~12.21中我们看到的是没有实现加载的进度条,即进度条的当前进度为0,如果开发者想要修改当前进度,可以使用两种方式:一种是 ...

  3. Xamarin XAML语言教程使用方法设置进度条进度

    Xamarin XAML语言教程使用方法设置进度条进度 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo与Progress ...

  4. Xamarin XAML语言教程Progress属性设置进度条进度

    Xamarin XAML语言教程Progress属性设置进度条进度 在图12.19~12.21中我们看到的是没有实现加载的进度条,即进度条的当前进度为0,如果开发者想要修改当前进度,可以使用两种方式: ...

  5. PowerMIL二次开发外挂制作视频教程-易语言编程15.7小时

    PM 二次开发外挂制作视频教程-易语言编程15.7小时 链接:https://pan.baidu.com/s/1DBNvygOVPnTEzPkopFAwqg 提取码:dx62

  6. 冯山C语言3 15,冯山

    篇一:冯山英语演讲稿 My Contribution to Low-carbon Proposition Hello, everyone! My name is Feng Shan .The topi ...

  7. 18春《c语言》在线作业3,18春福师《C++语言程序设计》在线作业二【参考答案】...

    福师<C  语言程序设计>在线作业二-0005 试卷总分:100    得分:0 一. 单选题 (共 20 道试题,共 40 分) 1.如果类A被说明成类B的友元,则(). A.类A的成员 ...

  8. c语言e怎么表示_如何一个月学完c语言

    大一的时候,一点都不自律,什么科目都是去那点名后,然后坐在最角落初自个玩手机,特别是程序课,我一个都不懂,有听一两节课还是听不懂,反正就是不懂就对了.课后也没复习.到了期中考,考了才知道我确实废了.不 ...

  9. 10万字C语言入门手册,历时三个月,详细的C语言教程终于出炉了,给你全新C语言入门体验

    C语言是一种非常流行的编程语言,它是许多现代编程语言的基础. 什么是计算机? 计算机是一种用于存储.处理.和输出数据的电子设备.它通过程序控制和数学算法来实现数据处理.计算机通过输入设备(如键盘.鼠标 ...

  10. c语言常用的关键词,【必读】超全的C语言基础知识大全

    我们用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,加深小伙伴们对C语言的认识. 例1:计算两个整数之和的c程序: #include main() { int a, ...

最新文章

  1. schema类SpringMVC+Hibernate+Spring整合(二)
  2. docker 删除默认连接_Net Core 中 Docker应用
  3. Python学习之路-12 (递归)
  4. 使用C语言读取properties文件V1.0
  5. int型 判断奇偶_905. 按奇偶排序数组
  6. ICCV11 Distributed Cosegmentation via Submodular Optimization on Anisotropic Diffusion
  7. pytorch BCELoss()、KLDivLoss()的参数 及 “对于size_average、reduce、reduction参数的研究”
  8. flash服务器停止响应,Adobe Flash Player已经在Windows 10上停止工作
  9. 基于STM32F405平台的多摩川协议编码器通讯过程(1)
  10. css文章排版代码,css文章排版
  11. 软件包的依赖性关系定义
  12. UE5中提示Video Memory Has Been exhausted解决方案
  13. 【全栈开发实战小草看书之Web端(一)开发环境】
  14. 计算机笔记Excel,秦路天善智能EXCEL学习笔记1-文本清洗函数
  15. 电信smgp3.0短信发送问题
  16. 定时器之计时(时间的转换)
  17. 2022年ACM杰出会员名单公布:23位华人学者入选
  18. Python Turtle 小项目11 玫瑰曲线
  19. 怎么在Arcgis中提取多个坐标点的dem值(高程)
  20. jquery-migrate

热门文章

  1. 60.windbg----as、$u0(固定别名、自定义别名)
  2. cocoscreator1.52 删除anysdk
  3. Unable to prase template Class Error message: Index 0 out of bounds for length 0
  4. 地铁三号线 - 为什么哭的时候总是叫我带娃?
  5. java手风琴代码_JavaScript实现手风琴效果
  6. Entry name 'kotlin/collections/MapWithDefault.kotlin_metadata' collided
  7. 今日恐慌与贪婪指数为10 恐慌程度稍有上升
  8. 现代教育技术计算机网络试题及答案,现代教育技术试题及答案解析
  9. css淡入动画,使用CSS淡入大动画效果
  10. 游戏挂机时计算机设置在哪里,电脑挂机锁如何设置 电脑挂机锁设置方法【图文】...