【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言
对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习一下即可哦。
结构体:字面上的意思就是有着层次结构的一种数据形式,所谓的层次结构就是我们在结构体中定义的各种成员了,再白话一点:结构体就是一个数据包,里面可以包含各种各样的数据。对于这句话我们还要深入挖掘一下"各种各样的数据”,对于我们编程而言-“一切皆是数据”。进一步理解,结构体里面可以包括整个程序中你想包含的东西。如果这样的推敲没错的话,那结构体还真有点东西了,画个图供大家揣摩,结构体的奇妙之处全在图里面了!
硬核小技巧之讲究的初始化
我们大部分初学的小伙伴一般都是直接对结构体变量直接进行初始化,(哈哈,可能很多小伙伴定了了变量根本就不会进行初始化)不过还是要养成比较好的编程习惯,虽然现在大部分集成开发环境都会为大家把一些全局变量初始化为0,不过对于代码的可移植性、可预知性考虑还是建议既然定义了就要给一个初始状态。
解析一下:上面是一个非常简单的代码,其中第一种结构体的初始化是linux源码中非常常见的一种方式,这种初始化的方式编译器必须要遵循ISO C99标准,否则只能使用第二种比较常规的方式,不过现在大部分编译器都支持该标准所以也被比较普遍的使用,其带来的好处有几点:1)对于结构体成员变量的初始化更加清晰,特别是当结构体特别大的时候;2)不用在乎初始化的顺序,只需要名字和数据对应上即可,非常的灵活。
硬核小技巧之讲究的多重别名
当你进行C编程时间久了以后,对于所属性一致的变量等你都会用结构体进行封装,那么可能出现同一个结构体可能多个地方使用的情况,并且结构体的作用会有所不同,就好像一个人他可能是一名学生,也有可能在外面兼职做一名服务员等等,如果这个人不穿一身衣服或者做个标记什么的可能有时候我们难以分辨,那么在C程序里面我们会怎样为他们换个衣服呢?简单代码如下:
解析一下:上面的代码确实挺简单的,可能有些小伙伴一眼就可以看懂,不过这种使用方法是非常有价值的,特别是以后大家玩算法,比如说:节点都是一样的,不过节点分为子节点和父节点,对于一些处理函数传入的参数虽然是一样的,不过意义却不同,我们就可以通过这样的方式进行处理,从而增加代码可读性。
硬核小技巧之讲究的0地址
这一块的内容算是这篇文章的最硬核的内容,各位小伙伴们要做好笔记了,深入学习C语言的一种方式就是多读读大佬们的代码,并且善于总结一些常用的小技巧供大家平时使用,今天就拿Linux的kernal中的两个宏定义来分享几个结构体小技巧:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr,type, member) ({ \
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++编程学习基地【点击进入】!
都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~
还有许多学习资料和视频,相信你会喜欢的!
涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......
【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!的更多相关文章
- iOS学习06C语言结构体
		
1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...
 - 飞控入门之C语言结构体、枚举
		
结构体 先来说明一下,结构体存在的意义.比如说有一只猫,要在C语言程序中综合描述它,那么可以这样说,它的体重是float类型的,颜色是char类型的,它的一些食物名字是一个数组,那么如果分开定义这些变 ...
 - C、C++、Java到Python,编程入门学习什么语言好?
		
摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...
 - Linux C语言结构体-学习笔记
		
Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...
 - GO语言学习(十六)Go 语言结构体
		
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
 - 漫谈C语言结构体
		
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
 - 漫谈C语言结构体【转】
		
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
 - 对嵌入式开发C语言结构体的一点总结
		
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...
 - 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
		
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
 
随机推荐
- 一文解开java中字符串编码的小秘密
			
目录 简介 Unicode的发展史 Unicode详解 UTF-8 UTF-16 UTF-32 Null-terminated string 和变种UTF-8 简介 在本文中你将了解到Unicode和 ...
 - 关于在异步操作中访问React事件对象的小问题
			
最近撸React的代码时踩了个关于事件处理的坑,场景如下:在监听某个元素上会频繁触发的事件时,我们往往会对该事件的回调函数进行防抖的处理:防抖的包装函数大致长这样: debounce = (fn, d ...
 - PicGo软件搭配gitee实现图床
			
1.安装PicGo软件,并配置gitee 1.1安装picGo picGo 安装gitee-uploader 插件 官网下载地址如下:最新版本 可以自行选择版本进行下载,这里我选择了最新的版本进行下载 ...
 - 架构设计 | 基于Seata中间件,微服务模式下事务管理
			
源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...
 - visual studio项目多级引用不拷贝dll的问题
			
最近碰到一个visual studio项目多级引用不拷贝dll的问题,花了很久查了很多资料,特此记录 A项目引用B项目, B项目引用C项目,C项目引用ef及oracle.ef using Oracle ...
 - Ruby探微初步
			
我的导师,曾经对我说过,常规编程语言大抵不过顺序.条件.循环 接下来以Ruby为例,简单说说 控制语句 控制语句能让程序在某种条件下,改变执行顺序,或者只执行某一部分. 控制语句的分类 控制语句大致可 ...
 - 在CentOS 7服务器中使用Jexus发布.net core webapi
			
环境: 服务器:CentOS 7 64位 .net core 2.1 Jexus独立版 官网:https://www.jexus.org/ 按照官网安装独立版命令:curl https://jexus ...
 - 将HBase中的表加载到hive中
			
两种方式加载hbase中的表到hive中,一是hive创建外部表关联hbase表数据,二是hive创建普通表将hbase的数据加载到本地 1. 创建外部表 hbase中已经有了一个test表,内容如下 ...
 - 电商订单ElasticSearch同步解决方案--使用logstash
			
一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logs ...
 - [vscode直接运行js文件报错]: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
			
报错示例: 报错原因: 在vscode里面编写了一段js代码,使用了import来引入一个函数并调用 代码复现 // inherit() returns a newly created object ...