基于proteus的51单片机仿真实例四十四、C语言的结构体演示实例

来源:互联网 发布:横道图用什么软件画 编辑:程序博客网 时间:2024/05/18 01:56
1、结构体与前面介绍过的数组一样,是一种构造类型的数据,它是将若干个不同类型的数据变量有序地组合在一起而形成的一种数据的集合体。组成该集合体的各个数据变量称为结构成员,整个集合体使用一个单独的结构变量名。一般来说结构中的各个变量之间是存在某些关系的,时间数据中的时、分、秒等。由于结构是将一组相关联的数据变量作为一个整体来处理的,因此在程序中使用结构体数据有利于对一些复杂而又有内在联系的数据进行有效管理
 
2、结构体类型变量的定义
主要有如下三种方式:
1)先定义结构体类型再定义变量名
struct 结构体名
{
成员列表
};
其中“结构体名”是结构体类型的标志,“成员列表”为该结构体中的各个成员,由于结构体可以由不同类型的数据组成,因此对结构体中各成员都要进行数据类型的说明。
例如定义一个关于学生的结构体student,它可以由以下结构体成员:年龄age,学号number,语文课成绩Chinese,数学课成绩math,....等。
struct student
{
unsigned char age;
unsigned int number;
float chinese;
float math;
...
};
定义好一个结构体后,就可以用它来定义结构体变量。一般格式为:
struct 结构体名 结构体变量名1,结构体变量名2,...结构体变量名n;
例如:可以用结构体student来定义不同学生的结构体变量:
struct student zhangsan,lisi;
这样结构体变量zhangsan,lisi都具有struct student类型的结构,他们可以使用该结构体中的数据。
2)在定义结构体类型的同时定义结构体变量名
一般格式为:
struct 结构体名
{
成员列表
}结构体变量名1,结构体变量名2,...结构体变量名n;
3)直接定义结构体变量
一般格式如下:
struct
{
成员列表
}结构体变量名1,结构体变量名2,...结构体变量名n;
第三种方法直接省略了结构体名,一般不提倡。
 
3、结构体变量的引用
定义了一个结构体变量之后,就可以对它进行引用,既可以进行赋值、存取和运算,一般情况下,结构体变量的引用是通过对其成员的引用来实现的。
1)引用结构体变量中的成员,一般格式为:
结构体变量名.成员名。
其中“.”是引用结构体成员的运算符。
例如:zhangsan.age=15,表示给结构体变量zhangsan中的成员age赋值。
2)对结构体变量中的各个成员可以像普通变量一样进行赋值、存取和运算
 
4、结构体变量的初始化
和其他类型的数据一样,对结构体变量也可以在定义的时候进行初始化。也可以在定义后对各个成员单独进行初始化。
 
5、结构体变量需要注意的地方
1)结构体类型与结构体变量是两个不同的概念。定义一个结构体类型时只给出了该结构体的组织形式,并没有给出具体的组织成员。因此结构体不占用任何存储空间,也不能对一个结构体名进行赋值、存取和运算操作。
而结构体变量则是一个结构体中的具体对象,编译器会给具体的结构体变量名分配确定的存储空间,因此可以对结构体变量名进行赋值、存取和运算。
2)讲一个变量定义为标准数据类型与定义为结构体类型会有所不同。前者只需要用类型说明符指出变量的类型即可,后者不仅要求用struct指出该变量为结构体类型,还要求指出该变量是那种特定的结构类型,即要求指出它所属的特定结构类型的名字。
3)一个结构体中的成员还可以是另外一个结构体类型中的变量,既可以形成结构体的嵌套。
 
6、本实例演示结构体的定义,结构体变量的定义和成员的引用
7、在keil c51中新建工程文件ex33,编写如下程序代码,编译并生成 ex33.hex文件
//实例33:结构体类型数据演示实例
#include <reg51.h>     //包含头文件
void delay(void)     // 延时函数
{
  unsigned int i,j;
 for(i = 0;i < 5000;i++)
  for(j = 0;j < 50;j++);
}
void main(void)
{
  struct time     
 {
  unsigned int hour;
  unsigned char minute;
  unsigned char second;
 }; // 定义一个结构体的数据类型
 struct time time1; //定义一个结构体变量
 time1.hour = 20; //结构体成员赋初值
 time1.minute = 35;
 time1.second = 55;
 P0 = time1.hour; //结构体成员的数据送P0口显示
 delay();
 P0 = time1.minute;
 delay();
 P0 = time1.second;
 while(1)
 {
 }
}
8、在proteus中新建仿真文件ex33.dsn,原理图如下图所示

9、将ex33.hex文件载入at89c51中,启动仿真,观察运行结果。





0 0