对于结构体的应用太多了,今天这篇文章我主要为你们总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,若是你对结构体的基础知识还不具有的话得回头看一下专栏教程或者本身找本书籍学习一下便可哦。linux
结构体:字面上的意思就是有着层次结构的一种数据形式,所谓的层次结构就是咱们在结构体中定义的各类成员了,再白话一点:结构体就是一个数据包,里面能够包含各类各样的数据。对于这句话咱们还要深刻挖掘一下"各类各样的数据”,对于咱们编程而言-“一切皆是数据”。进一步理解,结构体里面能够包括整个程序中你想包含的东西。若是这样的推敲没错的话,那结构体还真有点东西了,画个图供你们揣摩,结构体的奇妙之处全在图里面了!算法
咱们大部分初学的小伙伴通常都是直接对结构体变量直接进行初始化,(哈哈,可能不少小伙伴定了了变量根本就不会进行初始化)不过仍是要养成比较好的编程习惯,虽然如今大部分集成开发环境都会为你们把一些全局变量初始化为0,不过对于代码的可移植性、可预知性考虑仍是建议既然定义了就要给一个初始状态。编程
解析一下:上面是一个很是简单的代码,其中第一种结构体的初始化是linux源码中很是常见的一种方式,这种初始化的方式编译器必需要遵循ISO C99标准,不然只能使用第二种比较常规的方式,不过如今大部分编译器都支持该标准因此也被比较广泛的使用,其带来的好处有几点:1)对于结构体成员变量的初始化更加清晰,特别是当结构体特别大的时候;2)不用在意初始化的顺序,只须要名字和数据对应上便可,很是的灵活。微信
当你进行C编程时间久了之后,对于所属性一致的变量等你都会用结构体进行封装,那么可能出现同一个结构体可能多个地方使用的状况,而且结构体的做用会有所不一样,就好像一我的他多是一名学生,也有可能在外面兼职作一名服务员等等,若是这我的不穿一身衣服或者作个标记什么的可能有时候咱们难以分辨,那么在C程序里面咱们会怎样为他们换个衣服呢?简单代码以下:函数
解析一下:上面的代码确实挺简单的,可能有些小伙伴一眼就能够看懂,不过这种使用方法是很是有价值的,特别是之后你们玩算法,好比说:节点都是同样的,不过节点分为子节点和父节点,对于一些处理函数传入的参数虽然是同样的,不过意义却不一样,咱们就能够经过这样的方式进行处理,从而增长代码可读性。学习
这一块的内容算是这篇文章的最硬核的内容,各位小伙伴们要作好笔记了,深刻学习C语言的一种方式就是多读读大佬们的代码,而且善于总结一些经常使用的小技巧供你们平时使用,今天就拿Linux的kernal中的两个宏定义来分享几个结构体小技巧:spa
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)指针
#define container_of(ptr,type, member) ({ \blog
consttypeof( ((type*)0)->member ) *__mptr = (ptr); \教程
(type*)( (char *)__mptr - offsetof(type,member) );})
解析一下:
第一个宏定义的功能是得到一个结构体成员距离结构体首地址的偏移量,参数TYPE : 结构体类型;参数MEMBER : 结构体成员,其实这个算是比较简单的,把0地址强制类型转化为结构体类型指针,而后经过结构体指向成员便可得到结构体成员变量,而后经过&进行取地址便得到告终构体成员地址,成员的偏移 = (结构体成员地址 - 结构体首地址);然而结构体首地址为0,这样成员的偏移 = 结构体成员地址,应该足够清楚了吧。
第二个宏定义的功能是经过结构体成员变量得到对应的结构体首地址(也就是结构体地址),参数ptr :结构体成员变量地址;参数type : 结构体类型;参数member :结构体成员,这个宏定义可能对于一些小伙伴而言在写法上有一点点难度,不过其主要分两部分,第一部分经过typeof得到成员的类型并定义了一个const指针,定义为const的目的是不让用户对0地址的内容进行写操做,对于大部分芯片对不合法区域进行读写会引发异常。第二部分经过使用offsetof宏定义得到结构体成员相对结构体首地址的偏移,这样一相减便得到了当前结构体成员所属结构体的地址,原理公式:(结构体地址 = 结构体成员地址 - 结构体成员的偏移)。
这里大致说一下注意事项 : 在第二点咱们谈到了typeof关键字,该关键字是GUN C标准中扩展的关键字,因此在使用该宏定义的时候须要注意一下,否则采用其余标准进行编译可能会报错。
但愿对你们有帮助!
自学C/C++编程难度很大,若是你想更快提高本身的编程能力和编写项目的水平,欢迎一块儿共同成长!
C语言C++编程学习交流圈子,QQ群【757874045点击进入】微信公众号:C语言编程学习基地
有一些源码和资料分享,欢迎转行也学习编程的伙伴,和你们一块儿交流成长会比本身琢磨更快哦!