单片机C语言的业余爱好者可能对结构体可能不是很熟悉,结构体是个什么东东,其实结构体在计算机C编程中很常见。当我刚刚接触它的时候,第一印象是觉得它很神秘,因为没有什么好的参考资料(资料多的是,还是没找到,我就爱找客观原因……),所以才很费力。我希望其他爱好者不要走这样的弯路,故作此文章,同时也是对自己的一个提升吧,当然结构体并不是单片机C语言的必修课,若是您觉得很难或没什么兴趣,完全可以跳过。
结构体是个啥呢?实际上结构体就是封装变量的一个手段,使你的程序看起来更有层次,同时也方便管理,在以往的单片机C教材中,大家都没有注意到它,其实它也是个很有用的东西。
进一步说,使用结构体的实质就是通过定义结构体对象来访问结构体的成员变量。
如此说来,结构体好像也不太容易理解,下面我举个例子,在蓝牙控制器源代码中管理时间和闹钟信息的的就是一个结构体:
下面,我来逐句解释。
首先,定义结构体要使用结构体的关键字struct,就像你要定义一个无符号字符型变量要使用unsigned char一样。struct后面的time是干什么的呢?其实它是这个结构的名字,是用来在程序下文中定义结构体对象的,我们先放下这个话题,等会儿再进一步解释。
然后就像定义数组那样,要用到大括号,结尾还要有分号(这是重点,千万别忘了这个分号)。大括号中间来定义你的变量。
在大括号括回(})之后,分号之前,就可以定义你的结构体对象了。在这里说明一下,结构体与结构体对象是两个概念,程序操作的是结构体对象,而不是结构体本身。打个比方,我要统计植物的共性,并进一步探讨共性中的一些差别,如植物的共性都可以生长、发育、繁殖,但是具体的看,还是差别很大的,假如我只是说明一个植物的特点,我可以直接说它的生长、繁殖、发育的特点,那么要是多种植物呢?比如蕨类植物和苔藓植物,我总不能还像前面一样很含糊的说了吧?我应该说苔藓植物的生长、发育、繁殖是什么什么样的,蕨类植物的生长、繁殖、发育是什么什么样的。在这个例子中,结构体就相当于上文中的生长、繁殖、发育,结构对象就是苔藓植物和蕨类植物。怎么样,是不是能理出个头绪?
前面我们提到了结构体名字的作用,现在我来继续解释。在这段代码中,我们定义了5个结构对(Time,Alarm1,Alarm2,Alarm3,Alarm4)是比较固定的,假如我临时在某个函数中定义结构对象呢?有些经验的爱好者都知道,在函数中定义的变量(也就是局部变量)会在函数结束的时候被销毁。我就是要定义一个局部的结构对象,怎么办?这时候,我们就用到了结构的名字,也就是time(注意是小写哦)。有了它,我们就可以随便定义结构对象,不用在结构体声明的时候定义了。像这样:
struct time mytime;
要注意一个问题,在keil环境中,每个函数当中的变量要在刚进入函数的时候定义,不然编译器会报错。
有了结构对象,我们要怎么使用呢?下面,我们来了解一下。
具体说来,结构体最大的优势就是方便了管理,你不需要记那么多变量名称,记住两个名就可以了(结构体对象的名和结构体成员变量的名),当然如果你硬是要定义变量而不使用结构体,我也没啥意见,比对一下你就知道了结构体的优势了,拿前面的time结构举个例子,如果全部转化为定义变量:
如此定义需要35次,不仅要花费很多时间来写代码,而且还要记每个变量的名字,当变量更多的时候,想名字都是个问题!有了结构体,几行代码就可以完成定义。从理论上讲,上述35个变量所占内存大小等于time结构5个对象所占内存大小之和,都是35个字节,但是使用结构体让代码长度(注意不是代码大小哦)大大减小。
对结构对象对应的变量进行操作,也很方便,我们只需要结构对象的名字加一点(英文当中的句号.)再加上你要操作的变量就行了,就像这样。
总结一下,使用结构体只要注意一点,不要把结构体本身和结构体对象弄混就好。
其实有关于结构体的知识还有很多,比如结构体指针,结构体嵌套甚至是定义成员函数,因为在单片机C中并不常用,而且有的功能并不受编译器的支持,所以在这里我就不多介绍了,有兴趣的爱好者可以到网上了解有关的知识。可能我会在后面的文章中说到这些,欢迎大家关注。
本文没有参考任何书,是我在闲暇时(所谓的闲暇,比如:正在补作业,突然,哎呀,肚子疼,然后。。。。。。或者是:翻开作业本,这个单词咋读哩?然后。。。。。。其实我的闲暇时间还是很充裕的,哈哈)用手机拼出来的,欢迎大家拍砖。
同时真心希望本文对您有一定帮助(但愿我的表达能让人看懂)。