微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机之C语言-4.3结构体

51单片机之C语言-4.3结构体

时间:11-21 来源:互联网 点击:
既然既然相同长度单元格能放在一起,比如char1,char2,char3; int1,int2,int3; long1,long2,long3.在实际使用中,有些变量长度是不一样的,但由于它们之间相互关联也需要放在一起,那么要是不同长度的变量,想放在一起有没有办法呢?当然可以,这个就叫做结构体。现在按照数组的学习方法来研究结构体,两个问题,如何定义;如何访问结构体成员。

(1) 如何定义一个结构体

定义一个结构的一般形式为:

struct结构名

{成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

类型说明符成员名;

成员名的命名应符合标志符的书写规定。例如:

struct stu

{

int num;

char name[20];

char sex;

float score;

}

由以上可见,通过struct来定义一个结构体名,然后描述这个结构体中各个成员。struct stu类似于int或者char.为什么这么讲呢?我们来看看char是什么,char就是固定化的存储空间,一个字节,int就是固定的两个字节。我们知道变量是多样化的,现在我需要的变量既不是int 也不是char,而是int和char的综合,那怎么办?这个就是结构体了。简单的讲,int,char是固定好的存储空间划分,struct stu是自定义存储空间划分。类似于很多软件中有默认的设置,还有自定义设置。了解这点,我们来看看如何定义结构体变量:

先来深入了解一下前面我们是怎么定义变量的?比如char mystring, int mydata.这个是先划分存储空间然后,再给这个空间命名。比如char先要一个一个字节的单元格,然后给这个字节取个名字叫mystring,同样int就是先要2个字节的单元格,然后给这两个字节取个名字叫mydata. 同样对于结构体变量,我们先要一个存储空间,然后给这个空间取个名字。这个存储空间可以任意由你定义。比如struct stu.然后给这个空间取个名字,比如boy1.因此我们就知道了如何定义一个结构体变量。与其他变量并无区别。

struct stu boy1,boy2;等等。这里小结一下,结构体变量定义一共有三种方法:

1)先定义结构,再说明结构变量

struct stu

{

int num;

char name[20];

char sex;

float score;

}

struct stu boy1,boy2;

2) 在定义结构类型的同时说明结构变量

struct stu

{

int num;

char name[20];

char sex;

float score;

}boy1,boy2;

3)直接说明结构变量

struct

{

int num;

char name[20];

char sex;

float score;

}boy1,boy2;

第3种方法中省去了结构名。

(2)结构变量的初始化

和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。

那么结构体的成员能否为数组?当然可以。我们来看看如何在结构体成员中让某个成员为数组

struct mystruct {

int age;

int score;

char sex;

char myarry[3];

};

struct mystruct boy1;

void main(void)

{

boy1.myarry[0]=4;

boy1.myarry[1]=2;

boy1.myarry[2]=3;

}

这中方法是通过给数组的成员一个一个赋值

(3) 结构体成员的访问

那么如何访问结构体中的成员呢?我们访问数组的时候,比如数组a[4],我要访问第三个成员,那么直接使用a[2],就可以了。那么访问结构体成员,使用结构体变量加成员名,比如:

boy1.num

boy2.name

boy1.birthday.month

与普通变量完全相同。

#include "reg52.h"

typedef unsigned char uchar;

void delayUs(uchar t);

void delayMs(uchar t);

void main (void)

{

struct MyStruct

{

uchar DATA0;

uchar DATA1;

uchar DATA2;

uchar DATA3;

uchar DATA4;

uchar DATA5;

uchar DATA6;

uchar DATA7;

};

struct MyStruct MyData;

MyData.DATA0=0xfe;//点亮第1个LED

MyData.DATA1=0xfd;//点亮第2个LED灯

MyData.DATA2=0xfb;//点亮第3个LED灯

MyData.DATA3=0xf7;//点亮第4个LED灯

MyData.DATA4=0xef;//点亮第5个LED灯

MyData.DATA5=0xdf;//点亮第6个LED灯

MyData.DATA6=0xbf;//点亮第7个LED灯

MyData.DATA7=0x7f;//点亮第8个LED灯

while(1)

{

P1=MyData.DATA0;//点亮第1个LED灯

delayMs(100);

P1=MyData.DATA1;//点亮第2个LED灯

delayMs(100);

P1=MyData.DATA2;//点亮第3个LED灯

delayMs(100);

P1=MyData.DATA3;//点亮第4个LED灯

delayMs(100);

P1=MyData.DATA4;//点亮第5个LED灯

delayMs(100);

P1=MyData.DATA5;//点亮第6个LED灯

delayMs(100);

P1=MyData.DATA6;//点亮第7个LED灯

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top