(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灯
delayMs(100);
P1=MyData.DATA7;//点亮第8个LED灯
delayMs(100);
}
}
void delayUs(uchar t)
{
while(--t);
}
void delayMs(uchar t)
{
while(--t)
{
delayUs(245);
delayUs(245);
}
}
上一篇:51单片机之C语言-4.4运算符及表达式
下一篇:51单片机之C语言-4.2数组
推荐阅读最新更新时间:2024-03-16 14:48
设计资源 培训 开发板 精华推荐
- ZDS2022示波器-在加法中做减法
- 微信云备份要来?腾讯申请注册“WECHAT CLOUD”商标
- All in!Silicon Labs物联网计划全解读
- lpc1788移植u-boot-2010.03之spi flash移植
- CIS赛道持续火热,本土厂商机遇与挑战并存
- MEMS传感器应用场景群像分析和未来走势
- 利亚德:Micro LED2022年产能将达到1600KK/月
- Chiplet“乐高化“开启 UCIe联盟要打造芯片的DIY时代
- 第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API
- ARM+FPGA开发板基于FFMPEG的网络视频播放终端——米尔NXP I.MX 8M