本帖最后由 SingleYork 于 2016-8-29 20:26 编辑
bg7.png
I51开发板 第七讲:定时器之库函数
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);
结构体变量有三种存储种类,它们是extern、static和auto(即外部、静态和自动)。当结构体变量为外部全局变量或静态变量时,可以在定义结构体类型时给他赋初值,但不能给自动存储种类的动态局部结构变量赋初值。
自动结构体变量不能在定义时赋初值,只能在程序执行中用赋值语句给各结构体元素分别赋值。给结构体变量赋初值和给数组变量赋初值是一样的,当初值个数不够时,余下的结构体变量元素就以0作为其初值。但是,如果初值个数过多则会导致编译时出差。
I51开发板 第九讲:数组
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65774
(出处: ICKEY BBS)
本帖最后由 SingleYork 于 2016-8-29 20:26 编辑
bg7.png
I51开发板 第七讲:定时器之库函数
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);
结构体变量有三种存储种类,它们是extern、static和auto(即外部、静态和自动)。当结构体变量为外部全局变量或静态变量时,可以在定义结构体类型时给他赋初值,但不能给自动存储种类的动态局部结构变量赋初值。
自动结构体变量不能在定义时赋初值,只能在程序执行中用赋值语句给各结构体元素分别赋值。给结构体变量赋初值和给数组变量赋初值是一样的,当初值个数不够时,余下的结构体变量元素就以0作为其初值。但是,如果初值个数过多则会导致编译时出差。
I51开发板 第九讲:数组
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65774
(出处: ICKEY BBS)