7 描述一类对象的属性 ——结构体类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以通过成员操作符(或称分量操作符)“.”引用 结构体变量的一个成员。例如: student1.stuID
wenmingyao2008@yahoo.com.cn
6.1.5 结构体类型数据的输出
printf ("%d\n",student1);和scanf("%d",&student1);
printf ("%s,%d,%c,%d/%d/%d,%1d,%5.2f\n",student1);
wenmingyao2008@yahoo.com.cn
studSex;
studAge; studScore;
int float
} stdnt1, stdnt2, stdnt3;
(3)直接定义结构体类型变量。如:
struct {
unsigned int char char
wenmingyao2008@yahoo.com.cn
char int float };
struct Student stdnt1, stdnt2, stdnt3;
(2)在声明一个结构体类型的同时定义一个或若 干个结构体变量。如: struct Student{ unsigned int char studID; studName[20];
char
struct Student{ unsigned int stuID; ┇ }; struct Student stu[30]; struct Student{ unsigned int stuID; ┇ }stu[30]; struct{ unsigned int stuID; ┇ }stu[30];
6.1.3 结构体变量间的赋值
代码6.2
struct Student{ unsigned int studID; C语言允许两个同 char studName[20]; 类型的结构体变 char studSex; 量之间相互赋值。 int studAge; float studScore; }; #include <stdio.h> int main (void){ struct Student student1={50201,“WangLi”,’M’,18,89.5}; struct Student student2; student2=student1; /* 结构体变量间赋值 */ printf (“student1: %u,%s,%c,%u,%5.2f\n”, student1.stuID,\ student1.stuName,student1.stuSex,student1.stuAge,student1.stuScore); printf (“student2: %u,%s,%c,%u,%5.2f\n”, student2.stuID,\ student2.stuName,student2.stuSex,student2.stuAge,student2.stuScore); }
wenmingyao2008@yahoo.com.cn
printf ("%s,%d,%u\n",student1.stuName,student1.stuAge,student1.stuID);
× × √
6.2 结构体数组
同类型的结构体数据可以用数组存储
6.2.1 结构体数组的定义与初始化
1. 结构体数组的定义与初始化 定义结构体数组的方法与定义结构体变量方法相类 似,只是要多用一个方括弧说明它是个数组,并指 明数组的大小。
stu[0]=stu[1]; stu[1]=student1;
2. 引用结构体数组元素成员
例如,stu[i].stuID是引用下标为i的stu数组元素中 的stuID成员。 不能把结构体数组的元素作为整体直接用printf函数 进行输出。 输入一个结构体数组元素的值也可以使用gets函数。 应该以结构体数组元素的某个成员为对象进行输入 输出 。
50201 "ZhangXi" 'M' 18 90.5
wenmingyao2008@yahoo.com.cn
50202
50203
"WangLi"
"LiHong"
'F'
'M'
19
17
88.3
79.9
结构体变量的初始化应当在变量定义时进行,并 且要把初始值依次写在一对花括号内,用赋值运 算符赋值给对应的变量,如
wenmingyao2008@yahoo.com.cn
2. 结构体数组的初始化
代码6.3
struct Student{ unsigned int studID;
char
char int
wenmingyao2008@yahoo.com.cn
studName[20];
studSex; studAge;
其他元素系统将对数值 struct Student stu[]={{50201,"ZhangXi",'M',18,90.5}, \ 型成员赋以零,对字符 {50202,"WangLi",'F',19,88.3},{50203,"LiHong",'M',17,79.9}}; 型数据赋以 “空”(NULL),即“\0”。
也可以用以下形式进行初始化。 struct Student stdnt3= {50203,”LiHong”,’M’,17,79.9}; 在初始化时,按照所定义结构体类型的数据结构, 依次写出各初始值,在编译时就将它们赋给此变 量中各成员。
wenmingyao2008@yahoo.com.cn
第6单元 描述一类对象的属性
——结构体类型
一类对象的属性,是从不同角度的评价, 往往需要一组不同类型的数据。
6.1 结构体类型基础
结构体类型作为一种用户定制数据类型, 类型名字由两部分组成:一个是C语言 给出的关键字struct,它指明这种类型 的定义格式和使用方法,另一个名字由 用户自己给出。
6.1.1 结构体类型的定义
wenmingyao2008@yahoo.com.cn
6.1.2 结构体类型的实例化
定制一个结构体类型后,系统并不也无法为之 分配存储空间,仅仅得到一个结构体类型名。 有了这个类型名,就可以像int、char、float 和double一样,用来定义一些结构体类型的变 量。这个过程也称为结构体类型的实例化。
studID; studName[20]; studSex; studAge;
int
float
studScore;
} stdnt1, stdnt2, stdnt3;
定义变量后,在程序运行时系统将按照该结构体 变量各成员所需内存的总和为其分配一片连续的 存储单元。可以用sizeof运算符测出一个结构体 类型数据的长度,例如使用表达式
结构体类型的一般定义格百度文库:
struct 用户给定结构体类型名 {成员声明列表};
wenmingyao2008@yahoo.com.cn
注意:成员声明表列由一组“类型 成员名;”的声明组 成。
结构体类型的特点
(1)一个结构体类型由两个单词标志:第一个单 词为关键字struct,由系统提供,用以标识这是一 种结构体类型;第二个单词是具体的结构体名,也 称为“标记”或“符标”(flag),如这里的Student, 由程序设计者按标识符规则指定。这二者联合起来 组成一个类型标识符,即类型名。 (2)结构体由一些声明组成,用于说明该结构体 由哪些结构体成员或域——每个属性的类型及其名 字组成。
wenmingyao2008@yahoo.com.cn
1. 结构体变量的定义
(1)在定义了一个结构体类型之后,把变量定义为 该类型。
struct Student{ unsigned int char
wenmingyao2008@yahoo.com.cn
studID; studName[20]; studSex; studAge; studScore;
struct Student{ unsigned int char char
wenmingyao2008@yahoo.com.cn
studID; studName[20]; studSex; studAge;
int
float
studScore;
} stdnt1={50201,"ZhangXi",’M’,18,90.5}, stdnt2={50202,”WhangLi”,’F’,19,88.3};
wenmingyao2008@yahoo.com.cn
wenmingyao2008@yahoo.com.cn
#include <stdlib.h> #include <stdio.h> #define StuNUM 3 struct StudType{ unsigned int studID; char studName[20]; char studSex; int studAge; float studScore; };
wenmingyao2008@yahoo.com.cn
int main (void){ struct StudType stu[StuNUM]; int i; char ch; char numstr[16]; /* 输入数据 */ for (i=0;i<StuNUM;i++){ printf ("\nenter all data of stu[%d]:\n",i); gets (stu[i].stuName); gets (numstr);stu[i].stuID=atol(numstr); gets (numstr);stu[i].stuAge=atoi(numstr); stu[i].stuSex=getchar(); ch=getchar(); gets (numstr);stu[i].stuScore=atof(numstr); } /* 输出数据 */ printf ("\n record name \t \t num\tage\tsex\tscore\n"); for (i=0;i<StuNUM;i++) printf ("%d\t%-16s%-8d%d\t%-c\t%6.2f\n", i,stu[i].stuName,stu[i].stuID,stu[i].stuAge,stu[i].stuSex,stu[i].stuScore); }
Student类型的定义
代码6.1 Student类型的定义语句。
struct Student{ unsigned int studID;
char
char
wenmingyao2008@yahoo.com.cn
studName[20];
studSex; studAge; studScore;
int float };
sizeof (struct Student)
或使用表达式
wenmingyao2008@yahoo.com.cn
sizeof (stdnt1)
2. 结构体变量的初始化
在结构体类型定义中是不能对域成员初始化的, 只有用结构体类型定义了该结构体类型的变量后, 才能对结构体变量初始化。
stdnt1 stdnt2 stdnt3
6.2.2 结构体数组元素的引用
1. 引用结构体数组元素
可以将一个结构体数组元素赋值给同一结构体类型的 数组中另一个元素,或赋给同一类型的变量。如
struct Student stu[3],student1;
student1=stu[0];
wenmingyao2008@yahoo.com.cn
float
};
studScore;
stu[3]={{50201,"ZhangXi",'M',18,90.5}, \
{50202,"WhangLi",'F',19,88.3},{50203,"LiHong",'M',17,79.9}};
如果赋初值的数据的个数与所定义的数组元素相等,则 数组元素个数可以省略不写。如 只对前三个元素赋初值,
wenmingyao2008@yahoo.com.cn
wenmingyao2008@yahoo.com.cn
在执行“student2=student1;”这个赋值语句时, 将student1变量中各个成员的值依次逐个赋给 student2中相应各成员。显然,这两个结构体 变量的类型必须相同。
6.1.4 引用结构体变量的成员
如果提供的初始化数据组的个数少于数组元素的个数, 则方括弧内的元素个数不能省略,如
wenmingyao2008@yahoo.com.cn
struct Student stu[30]={{50201,"ZhangXi",'M',18,90.5}, \ {50202,"WangLi",'F',19,88.3},{50203,"LiHong",'M',17,79.9}};