C语言结构体硬核玩法?看这文章,C语言学习难度又增加了

C语言结构体硬核玩法?看这文章,C语言学习难度又增加了当你进行C编程时间久了以后,对于所属性一致的变量等你都会用结构体进行封装,那么可能出现同一个结构体可能多个地方使用的情况,并且结构体的作用会有所

前言

对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习一下即可哦。

C语言结构体硬核玩法?看这文章,C语言学习难度又增加了

结构体:字面上的意思就是有着层次结构的一种数据形式,所谓的层次结构就是我们在结构体中定义的各种成员了,再白话一点:结构体就是一个数据包,里面可以包含各种各样的数据。对于这句话我们还要深入挖掘一下”各种各样的数据”,对于我们编程而言-“一切皆是数据”。进一步理解,结构体里面可以包括整个程序中你想包含的东西。如果这样的推敲没错的话,那结构体还真有点东西了,画个图供大家揣摩,结构体的奇妙之处全在图里面了!

C语言结构体硬核玩法?看这文章,C语言学习难度又增加了

硬核小技巧之讲究的初始化

我们大部分初学的小伙伴一般都是直接对结构体变量直接进行初始化,(哈哈,可能很多小伙伴定了了变量根本就不会进行初始化)不过还是要养成比较好的编程习惯,虽然现在大部分集成开发环境都会为大家把一些全局变量初始化为0,不过对于代码的可移植性、可预知性考虑还是建议既然定义了就要给一个初始状态。

C语言结构体硬核玩法?看这文章,C语言学习难度又增加了

解析一下:上面是一个非常简单的代码,其中第一种结构体的初始化是linux源码中非常常见的一种方式,这种初始化的方式编译器必须要遵循ISO C99标准,否则只能使用第二种比较常规的方式,不过现在大部分编译器都支持该标准所以也被比较普遍的使用,其带来的好处有几点:1)对于结构体成员变量的初始化更加清晰,特别是当结构体特别大的时候;2)不用在乎初始化的顺序,只需要名字和数据对应上即可,非常的灵活。

硬核小技巧之讲究的多重别名

当你进行C编程时间久了以后,对于所属性一致的变量等你都会用结构体进行封装,那么可能出现同一个结构体可能多个地方使用的情况,并且结构体的作用会有所不同,就好像一个人他可能是一名学生,也有可能在外面兼职做一名服务员等等,如果这个人不穿一身衣服或者做个标记什么的可能有时候我们难以分辨,那么在C程序里面我们会怎样为他们换个衣服呢?简单代码如下:

C语言结构体硬核玩法?看这文章,C语言学习难度又增加了

解析一下:上面的代码确实挺简单的,可能有些小伙伴一眼就可以看懂,不过这种使用方法是非常有价值的,特别是以后大家玩算法,比如说:节点都是一样的,不过节点分为子节点和父节点,对于一些处理函数传入的参数虽然是一样的,不过意义却不同,我们就可以通过这样的方式进行处理,从而增加代码可读性。

硬核小技巧之讲究的0地址

这一块的内容算是这篇文章的最硬核的内容,各位小伙伴们要做好笔记了,深入学习C语言的一种方式就是多读读大佬们的代码,并且善于总结一些常用的小技巧供大家平时使用,今天就拿Linux的kernal中的两个宏定义来分享几个结构体小技巧:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 
#define container_of(ptr, type, member) ({ \
         const typeof( ((type *)0)->member ) *__mptr = (ptr); \
         (type *)( (char *)__mptr - offsetof(type,member) );})

解析一下:

  1. 第一个宏定义的功能是获得一个结构体成员距离结构体首地址的偏移量,参数TYPE : 结构体类型;参数MEMBER : 结构体成员,其实这个算是比较简单的,把0地址强制类型转化为结构体类型指针,然后通过结构体指向成员即可获得结构体成员变量,然后通过&进行取地址便获得了结构体成员地址,成员的偏移 = (结构体成员地址 – 结构体首地址);然而结构体首地址为0,这样成员的偏移 = 结构体成员地址,应该足够清楚了吧。
  2. 第二个宏定义的功能是通过结构体成员变量获得对应的结构体首地址(也就是结构体地址),参数ptr :结构体成员变量地址;参数type : 结构体类型;参数member :结构体成员,这个宏定义可能对于一些小伙伴而言在写法上有一点点难度,不过其主要分两部分,第一部分通过typeof获得成员的类型并定义了一个const指针,定义为const的目的是不让用户对0地址的内容进行写操作,对于大部分芯片对不合法区域进行读写会引起异常。第二部分通过使用offsetof宏定义获得结构体成员相对结构体首地址的偏移,这样一相减便获得了当前结构体成员所属结构体的地址,原理公式:(结构体地址 = 结构体成员地址 – 结构体成员的偏移)。
  3. 这里大体说一下注意事项 : 在第二点我们谈到了typeof关键字,该关键字是GUN C标准中扩展的关键字,所以在使用该宏定义的时候需要注意一下,不然采用其他标准进行编译可能会报错。

尾言

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程

《C语言51课视频教程合集》《C++45课视频教程》

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

今天的文章C语言结构体硬核玩法?看这文章,C语言学习难度又增加了分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7780.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注