找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2328|回复: 0
收起左侧

关于一个C语言结构指针的臆想

[复制链接]
ID:82781 发表于 2015-6-13 17:08 | 显示全部楼层 |阅读模式


我为这个问题纠结,那就是C中的结构指针,书中常见的形制大致是这样的:
struct
{
     uint32_t a;
     uint16_t b;
     uint8_t c;
}*numb;
然后再程序中引用这个结构指针就是numb->a和numb->b没什么问题,悲剧的是在库文件中发现一种我不能解释的形制如下:
#define numb (numb_typ*)地址这种新式,numb_typ是一个类似结构宏的定义,问了好多人,只言片语,不解其故,怎么解释呢?我翻来覆去的想这个问题,终于在今早上洗脸的时候突然想到这问题可能是这样的:

首先:不要管这个宏把它拆解,就是(numb_typ*)地址这种形式那么这个numb_typ是数据类型因为没记错的的话结构和枚举都是数据类型,有在外面加了括号-----“强制类型转换”但是他转换谁呢?转换地址吗?显然不是,他肯定不是转换地址,地址他也不需要转换,那他转换谁呢?这时候看看他的后面紧跟“*”,似乎预示着什么?是不是可以理解为他强制转换了一个结构指针?但是变量跑哪里去了?没有变量的指针伤不起啊,从结果看是肯定定义的,因为结果中就是用结构指针的形式访问的。
其次:另一方面讲他有不符合常理,不按套路出牌,他没有用赋值的办法来把地址写入而是直接类似定义一个结构指针变量,但是只有把它理解成它定义了一个结构指针变量才符合常理,就变成这种
          (numb_typ)*p;
          p=(numb_typ*)地址;//立即数转换为地址

这样P就是一个结构指针,他就指向以这个地址开头的连续数据区域。所以:
(numb_typ*)地址<=>(numb_typ)*p;p=地址;两者等价,前者的形制更简便速度更快,效率更高,只有他等价才可以解释为什么可以用结构指针来访问,想必就是“*”带来的困惑,哎!

总之:以上所述均是不可靠的,有带进一步请教高人,暂且这样理解吧,这种写法是合法的,C语言啊C语言灵活是你的优点也是你的缺点,你太灵活大了!这也映射了人生,加油吧,不管结果是什么但我从未放弃!









回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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