I51开发板 第八讲:结构体

  • SingleYork
  • LV5工程师
  • |      2016-08-24 16:38:55
  • 浏览量 2670
  • 回复:19
本帖最后由 SingleYork 于 2016-8-29 20:26 编辑 bg7.pngI51开发板 第七讲:定时器之库函数 https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65601 (出处: ICKEY BBS)

在前面几个程序里,我们都用到了结构体,那么在这一讲里,本菜就跟大家一起简单学习一下结构体的相关知识。

首先,什么是结构体呢?

所谓的结构体其实就是由一系列具有相同类型或不同类型的数据构成的数据集合。在C语言中,结构体(Struct)指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。

结构体变量的定义有三种方法,下面我们将针对这三种方法分别概述一下:

1、先定义结构体类型再定义结构体变量名

定义结构体类型的一般格式为:

struct   结构体名

        {结构体元素表};

其中,“结构体元素表”为该结构体中的各个成员(又称为该结构体的域),由于结构体可以由不同类型的数据组成,因此对结构体中各个成员都要进行类型说明。例如,一个时间结构体类型time,他由三个结构体元素hour、min、sec组成,定义格式如下:

struct time{

        unsigned char hour;

        unsigned char min; 

        unsigned char sec; 

};

定义好一个结构体类型之后,就可以用它来定义结构体变量。一般格式为:

struct 结构体名 结构体变量名1,结构体变量名2,……结构体变量名n;

例如,可以用结构体time来定义1个结构体变量clocktime1,clocktime2

struct time clocktime1,clocktime2;

结构体变量clocktime1,clocktime2都具有struct time类型的结构体,即它们都是由三个无符号整型数据所组成的。

2、在定义结构体类型的同时定义结构体变量名

这种方法是将方法1的两个步骤合到一起,一般格式为:

struct 结构体名 

例如,对于上述时间结构体变量也可以按以下格式定义:

struct time{

        unsigned char hour;

        unsigned char min; 

        unsigned char sec; 

}clocktime1,clocktime2;

3、直接定义结构体变量

这种方法可以省略结构体名,又称为无名结构体,一般格式为:

struct

{结构体元素表}结构体变量名1,结构体变量名2,……,结构体变量名n;

例如,上述时间结构体变量可以按一下格式定义:

struct {

unsigned char hour;

unsigned char min; 

unsigned char sec; 

}clocktime1,clocktime2;

第三种方法与第二种方法十分相似,所不同的是第三种方法中省略了结构体名“time”。这种方法一般只用于定义几个确定的结构体变量的场合。不过为了便于记忆和以备将来进一步定义其他结构体变量需要,一般还是不要省略结构体名为好。此外,也可以使用关键字typedef来命名一个结构体类型,这时结构体名就不太重要了。例如:

typedef struct {

unsigned char hour;

unsigned char min; 

unsigned char sec; 

}time;

这样time实际上就成了一个结构体类型,可以直接来定义结构体变量,例如:

time clocktime1,clocktime2;

这时变量 clocktime1和clocktime2就都具有上述结构体类型。

定义了一个结构体变量之后,就可以对它进行引用,完成赋值、存取和运算等。一般情况下,结构体变量的引用是通过对其结构体元素的引用来实现的。引用结构体元素的一般格式为:

结构体变量名.结构体元素

其中,“.”是存取结构体元素的成员运算符。例如,clocktime.sec表示结构体变量clocktime中的元素sec,clocktime.min表示结构体变量clocktime中的元素min等。如果一个结构体变量中结构体元素又是另外一个结构体变量,即出现结构体嵌套时,则需要采用若干个成员运算符,一级一级地找到最低一级结构体元素,而且只能对这个最低级结构体元素进行访问。

对结构体变量中的各个元素可以像普通变量一样进行赋值、存取和运算。例如:

clocktime1.sec=20;

clocktime2.sec=30;

sum = clocktime1.sec + clocktime2.sec;

clocktime1.min++;

其中成员运算符“.”的优先级别最高,因此clocktime1.min++是对clocktime1.min进行自加运算,而不是先对min进行自加运算。time.day.sec是对嵌套结构体类型中最低一层的结构体进行访问。

对于结构体变量和结构体元素,可以在程序中直接引用他们的地址。例如,若需要输入clocktime1.sec的值,可以写成:

scanf("d%",&clocktime.sec);

又如,输出结构体变量clocktime2的首地址,可写成:

printf("c%",&clocktime2);

结构体变量有三种存储种类,它们是externstaticauto(即外部、静态和自动)。当结构体变量为外部全局变量或静态变量时,可以在定义结构体类型时给他赋初值,但不能给自动存储种类的动态局部结构变量赋初值。

自动结构体变量不能在定义时赋初值,只能在程序执行中用赋值语句给各结构体元素分别赋值。给结构体变量赋初值和给数组变量赋初值是一样的,当初值个数不够时,余下的结构体变量元素就以0作为其初值。但是,如果初值个数过多则会导致编译时出差。

I51开发板 第九讲:数组 https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65774 (出处: ICKEY BBS)
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:4
我们都一样 2016-08-24
讲得不错:victory:
0   回复
举报
发布
SingleYork 回复 2016-08-24
感谢支持……
0   回复
举报
hkevin 回复 2016-08-25
讲得不错, 学习了 !
0   回复
举报
瞎折腾 回复 2016-08-26
把数组和指针结合起来讲一下啊
0   回复
举报
huihui163 回复 2016-08-29
讲的很好,我现在是初学者,已经学习了中断定时按键数码管这个后期会用到,赞一个
0   回复
举报
kk118a 2016-08-24
讲的好,再看一遍能懂
0   回复
举报
发布
SingleYork 回复 2016-08-24
感谢支持……
0   回复
举报
SingleYork 回复 2016-09-12
感谢支持……
0   回复
举报
SingleYork 2016-08-24
荣丰宇 发表于 2016-8-24 18:48 楼主讲得不错,支持~
感谢支持,其实很多知识点也是参考别人的教程啦,不敢独占别人成果~
0   回复
举报
发布
荣丰宇 2016-08-24
楼主讲得不错,支持~
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子