- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体类型的说明
结构体类型struct student的定义中,成员birthday是结构体类型,这就形成了结构体的嵌套。 结构体类型的定义完成后,我们就可以应用该结构体类型的变量,它的使用和int ,float等相同,如上 例中定义了struct date结构体类型,在struct student结构体定义中用到了struct date结构体类型的 变量birthday。
{ char num[10];
char name[8];
char sex[2]; struct date birthday; }; struct student stu[3]={{“000102”,“张三”,“男”,{1980,9,20}}, {“000105”,“李四”,“男”,{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} }; Nhomakorabea7
结构体
3.结构体变量初始化
结构体变量的初始化
和一般变量、数组一样,结构体变量和数组也可以在定义的同时赋初值。 结构变量初始化的格式: 结构变量={初值表}
如果某成员本身又是结构类型,则该成员的初值为一个初值表。 struct student { char num[10]; char name[8]; char sex[2]; struct date birthday; }std={"000102", "张三", "男", {1980,9,20}};
12
结构体
通过指针变量引用结构体成员的注意事项 struct {int a;char*s;}x,*p=&x; 且变量x的成员a、指针成员s已正确赋值,则如下表达式
结构体变量的引用
++p->a: 使得x的成员a增1,而不是p增1,因为运算符->优先级高于++,其等价于++(p->a) (++p)->a: 在访问x的成员a之前使p增1 (p++)->a与p++ ->a效果等价,都是在访问p所指变量中的a成员之后使p再增1 *p->s引用变量x中s所指存储单元; *p->s++引用变量x中s所指存储单元之后,使指针s增1;
【解析】选项A中可以在声明变量的同事为data2赋值,但是data2=(2,6);应写作data2={2,6}。
所以选择选项A。 【答案】A
16
真题链接
2.有以下程序段: struct st { int x; int *y; } *pt; int a[]={1, 2}, b[]={3, 4}; struct st c[2]={10, a, 20, b}; pt=c; 以下选项中表达式的值为11的是( A)++pt->x B)pt->x C)*pt->y D)(pt++)->x )。 【解析】本题考查结构体数组初始化以及结构体变量的引用,题目中定 义了一个结构体数组c并初始化,指针pt指向c的第一个元素,那么pt>x为10,++pt->x为11,*pt->y为1,(pt++)->x为20,所以答案为A。 【答案】A
{
数据类型1 成员名1; 数据类型2 成员名2;
┋
数据类型n 成员名n; };
2
结构体
例如,描述日期定义的结构体类型:
struct date {
结构体类型的说明
int year;
int month; int day; };
其中date是结构体名,该结构体类型是由三个成员组成。成员都是整型,可根据自己需求编写成员,
(*p->s)++使得变量x中s所指存储单元值增1;
*p++->s在访问了变量x中s所指存储单元之后,使指针p增1;
13
结构体
main ( ) struct date { {
例题
struct stud student1={"WangLi",20,'M',12,15,1978,89101,89.5};
student1.age,
student1.sex,student1.birthday.month,student1.birthday.day, student1.birthday.year,student1.num,student1.score); printf("student2:%s,%d,%c,%d,%d,%d,%ld,%5.2f\n",, student2.age, student2.sex,student2.birthday.month,student2.birthday.day, student2.birthday.year,student2.num,student2.score); }
5
结构体
结构体变量的定义
(3)直接定义结构体类型变量,即不定义结构体类型名,在写出结构体类型后直接写出变量名 例如:
struct {
int year; int month;
int day;
} student1,student2; (4)使用typedef说明一个结构体类型名,再用新类型名来定义变量
成员的数据类型可以是任何数据类型,当然也可以包含结构体类型。注意最后大括号后要加上分号 “;”作为结束。
3
结构体
例如:描述学生的结构体 struct student { char num[10]; char name[8]; char sex[2]; struct date birthday; };
15
真题链接
1.设有定义: struct complex { int real, unreal; } data1={1, 8}, data2; 则以下赋值语句中错误的是( A)data2=(2,6); B)data2=data1; )。
C)data2.real=data1.real;
D)data2.real=data1.unreal;
结构体数组名[下标].成员名
11
结构体
结构体变量的引用
• 结构体数组元素和类型相同的结构体变量一样,可相互赋值。例如: arr[1] = arr[0]; 3、若引用结构体变量std中数组成员sc中的元素sc[2]时,可写为: std.sc[2]或ps->sc[2]或(*ps).sc[2] 注意:不能写成std.sc,因为sc是一个数组名,C不允许对数组整体访问(字符串除外),只能逐个引用其元素 4、如果成员本身又属于一个结构体类型,则需要再次使用取成员运算符“.”,这样逐级的应用成员运算符找到 最低级的成员。 如:std.birthday.year、 ps->birthday.year 、(*ps).birthday.year,引用结构体数组arr第2个元素arr[2] 中的出生年份时,可写作arr[2].birthday.year 注意:birthday后面不能使用->运算符,因为birthday不是指针变量 5、对结构体类型变量的成员所能执行的操作,与具有相同类型的普通变量所能执行的操作相同,包括赋值、 输入输出、运算等
指向运算符。它由减号”-”和大于号”>”两部分构成,之间无空格。
(3)第三种形式也是通过一个结构体指针变量来引用它所指向的结构体变量的成员,一对圆括号不能少 (4)这些运算符与圆括号、下标运算符的优先级相同,在C运算符中优先级最高。
10
结构体
例如:
struct student { char num[10]; char name[8]; char sex[2]; struct date birthday;
例如:
typedef struct { char num[10],name[8],sex[2]; struct date birthday; }STU;
STU
s[10];
6
结构体
结构体变量的定义
注意:定义结构体变量后,编译系统为它分配存储空间,存储空间的大小是结构体各成员变量所占内存单元的总和
结构体类型变量说明: (1)结构体类型与变量的概念不同。对变量来说,一般先定义结构体类型,然后再定义该结构体类型的变量。 只能对变量赋值、存取或运算,而不能对类型赋值、存取或运算。在编译时对类型是不分配存储空间的,只 对变量分配存储空间。
(1)初始化的数据顺序及其类型要与各个成员一一对应,对于包含嵌套结构体类型的变量,
其嵌套部分的初始化也按顺序赋初值 (2)初始化时如果初值个数少于结构体中成员个数,则将无值对应的成员赋以0, 但如果初值个数多于结构体成员个数,则编译出错。
8
结构体
4.结构体数组的初始化
结构体变量的初始化
结构体数组的每一个元素相当于一个结构体变量(均包含结构类型的所有成员)。 可在定义时进行初始化;其一般格式为: 结构数组[n]={{初值表1},{初值表2},...,{初值表n}} 例如: struct student
结构体变量的引用
float sc[4]
}std,arr[5],*ps; ps=&std;
1.若引用结构体变量std中成员sex,可写为:
std.sex
ps->sex
(*ps).sex
2.若引用结构体数组arr的第0个元素arr[0]中的sex成员,可写为:
arr[0].sex
注意: • 不能写成arr.sex,因为arr是一个数组名不是变量,结构体数组元素的成员引用一般形式为:
int month;
int day; int year; }; struct stud { char name[20]; int age; char sex; struct date birthday; long num;
struct stud student2;
student2=student1; printf("student1:%s,%d,%c,%d,%d,%d,%ld,%5.2f\n",,
4
结构体
2.结构体变量的定义
(1)先定义结构体类型再定义变量,
结构体变量的定义
例如上面已定义了一个结构体类型 struct date和struct student ,可以用它们来定义变量:
struct date birthday; struct student t1,s[20],*t2 (2)在定义结构体类型的同时定义变量 例如:上面可改写为: struct date { int year; int month; int day; } student1,student2;
(2)对结构体变量中的成员,可以单独使用,其作用与地位相当于普通变量。
(3)结构体类型的成员可以是一个已定义的结构体类型变量。 如:结构体类型struct student中的struct date birthday;这样先定义了一个struct date类型,它包括三个成
员,然后在定义结构体类型struct student时,成员birthday被定义为struct date类型。 (4)结构体类型中的成员可以与程序中的变量同名,二者不代表同一对象。
float score;
};
14
结构体
例题
对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。
#include <stdio.h> #include <string.h> struct person { char name[20]; int count; } leader[3]={"Li",0,"Zhang",0,“Sun",0}; main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for( j=0;j<3;j++) if (strcmp(leader_name,leader[ j].name)==0) leader[ j].count++; } printf("\n"); for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); }
9
结构体
三种形式来引用结构体变量中的成员。 (1)结构体变量名.成员名 (2)指针变量名->成员名
结构体变量的引用
(3)(*指针变量名).成员名
说明:
(1)第一种形式是通过一个结构体变量引用自己的成员变量,其中点号”.”称为成员运算符。
(2)第二种形式是通过一个结构体指针变量来引用它所指向的结构体变量的成员,其中箭头”->”称为结构
Designed by @JFT
全国计算机等级考试之
二级C语言
未来教育
结构体
结构体是一种较为复杂但却非常灵活的构造型数据类型。结构体由若干个不同类型的数据项组成,构成结构体的 各个数据项称为结构体成员
1.结构体类型的定义 结构体类型的定义的一般形式为: struct 结构体类型名
(1)struct是定义结构体类型的关键字,是结构体类型的标志。 (2)结构体名和结构成员名表都是由用户定义的标识符, 遵循标识符命名规则。 (3)同一结构体说明中,不能有相同的名字变量, 但不同结构体说明中成员可以同名。 (4)结构体说明要以“;”结尾,其中每个成员后也需加分号;