第11章结构体及共用体
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 paaa––r...upiicf}nn=不可==h;ti&11=fo能以f(;.‘nla“5ao用在例;%;d’a;一定atdt例f”例a个义;u{,}aan共共a.,iib=fuu{o){}ai用 用cfl,;n}n{nnolc=haoai1it,a体 体;ao1o*a,icftibri’nn;npt;l变 变hnao;ctx,fat’da;h量 量i;,rit;[1;;3cf时 为.(5]h;;c};另初编h(;a一始(d译)r*[个化cp(0通h)]变..;)ii过量fl(,o赋d*a[p值运t0)]f..c;行chh结(*果pd)[.不0f].对f ) a.i=1; a.ch=‘a’; a.f=1.5;
2020/10/13
10
#include<stdio.h>
#include<string.h>
struct person
{char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Fun",0}; void main()
{int i,j;
char leader_name[20];
2020/10/13…}
(1)结构体变量.成员名 (2)(*p).成员名 (3) p-> .成员名
12
eg11.3 #include<string.h> void main()
{struct student {long int num;
char name[20];
char sex;
float score;
低一级的成员,对它进行赋值或存取以及运算. student1.birthday.month student1.birthday
3)成员可以像普通变量一样进行各种运算.
student2.score= student1.score;
2020/10/1s3tudent1.age++;
6
11.4 结构体变量的初始化
:
}}
2020/10/13
15
2、结构传递(全体传递,多值传递): 用结构变量作实参
将结构变量所占的内存单元内容全部顺序传递给形参(值 传递),由于采用值传递内存开销大、在被调函数中改变 的形参值不能返回主调用函数,因此在使用上很不方便。 eg11.5.c
3、传引用调用(地址传递): 定义结构指针变量并以此指针作为实参
{10101,"LiLin",'M',18,87.5,"123 Beijing"},
{10102,“zhangfun",'M',19,99,"123 Shanghai"},
{10104,“Wang Min",‘F',20,78.5,"123 Nanjing"}};
2020/10/13
9
10101
“li lin”
长度=最长成员所占字节数
18
– 共用体变量引用
• 引用方式:
共用体变量名.成员名 共用体指针名->成员名 (*共用体指针名).成员名
u• n引ion用d规ata则 –{不能in引t i;用共用体变量,只能引a.用i 其a成.ch员 a.f – 共用ch体ar变c量h;中起作用的成员是p-最>i后一p-次>c存h放p的->成f 员
任一时刻只有一个成员存在
2020/10/13
20
例 结构体中嵌套共用体 eg11.12
struct { int num;
char name[10]; char sex; char job; union { int class;
char position[10]; }category; }person[2];
for(i=1;i<=5;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++)
2020/10/13
2020/1仅0/13在定义时可整体初始化
7
11.5 结构体数组
1 )定义结构体数组 将结构体定义中的变量定义为数组即可
struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; };
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
{10104,"Wang Min",'F',20}};
void main()
{ struct student *p;
for(p=stu;p<stu+3;p++)
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);
}
2020/10/13
stu[0] stu[1] stu[2]
10010 Li Gang M 18 87.5 Beijing
结构的定义:struct student
{int num; char name[20];
结构类型
char sex;
int age;
2020/10/13
float score;
struct student stu;
char addr[30];
14
3)用结构体变量和指向结构体的指针作函数参数
把结构传递给函数有三种方式: 单个成员 整个结构 指向结构的指针
1、成员传递:用结构变量成员作为实参(值传递)
例如:对于上面定义的结构变量stu_1有四个成员。 其中任何一个都可以做实参。
void main()
{……
{ prin(stu_1.num);
形式二: union data { int i; char ch; float f; }; union data a,b,c,*p,d[3];
形式三: union
{ int i; char ch; float f;
}a,b,c;
i ch
f
a
i ch
f
b
共用体变量任何时刻 共用体变量定义分配内存,
20只20/1有0/1一3 个成员存在
注意 (1)类型与变量是不同的概念;
2020/10/13
(2)对结构中的成员可以单独使用; (3)成员可以是结构变量;
赋值.存取.运算;在 编译时分配内存
2
11.1 概述
➢ 结构:一种构造类型数据 (一条记录)
不同类型的数据组合成一个整体,以便引用 ➢为什么引入结构型数据?
num name
sex age score addr
第十一章 结构体与共用体
构造的数据类型 • 结构体的定义 • 结构体的初始化 • 访问结构体成员 • 结构体和函数
2020/10/13
1
2、定义结构的同时定义结构变量: struct student {………
}studend1, student[2];(变量表列)
3、直接定义结构变量: struct {……… }studend1, student[2];
11
printf("%5s:%d\n",leader[i].name,leader[i].count);}
11.6 指向结构体类型数据的指针
结构体变量的指针是该变量所占内存区域的起始地址。
1) 指向结构体变量的指针
{… struct student stu1; struct student *stu1Ptr; stu1Ptr=&stu1; stu1.num=10010; (*stu1Ptr).num=10010; stu1Ptr->num=10010;
b=a; ()
x=a.f; ()
2020/10/13
19
– 结构体与共用体
• 区别: 存储方式不同 • 联系: 两者可相互嵌套
struct node
{ char ch[2];
ch
int k;
k
}a;
变量的各成员同时存在
a
union node { char ch[2];
int k; }b;
ch k
b
};
3
➢ 结构体类型的形式:
struct 结构体名
{类型名1 成员名1;
关键 类型名2 成员名2;
字
:};
这个结构就是一种 数据类型
结构体类型许多种
11.2 定义结构体类型变量的方法
2020/10/13
4
成员可以是结构变量
struct date {int month; int day; int year; }; struct student {int num; char name[20]; struct date birthday; char addr[30] ; }student1,student2;
};// stu_1 ={89031,"Li Lin",'M',89.5};
struct student stu_1; struct student *p; p=&stu_1;
stu_1.num=89031;
strcpy(stu_1.name,"Li Lin");
stu_1.sex='M'; stu_1.score=89.5;
struct student stu[3];
2020/10/13
8
2 )结构体数组的初始化
struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; };
struct student stu[3]={
printf("NO.:%ld\nname:%s\nsex:%c\nscore:%f\n",
stu_1.num,stu_1.name,stu_1.sex,stu_1.score);
printf("NO.:%ld\nname:%s\nsex:%c\nscore:%f\n",
2020/10/13
13
(*p).num,(*p).name,(*p).sex,(*p).score);}
2)指向结构体数组的指针
例 11.4
#include <stdio.h>
struct student { int num;
char name[20];
p 10101 Li lin M
char sex;
p+1
18
int age;
}stu[3]={{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19},
2020/10/13
name num sex
job
class position
Li 1011 F S
501
Wang2086 M T
prof
循环n次 读入姓名、号码、性别、职务
真
job==‘s’
假
读入class
真
job==‘t’ 假
读入 输出 position“输入错”
循环n次
job==‘s’
num name
birthday
addr
month day year
2020/10/13
5
11.3 结构体变量的引用
结构体变量不能整体引用,只能引用其成员
1) 结构体变量中成员的引用方式 结构体变量名.成员名 例如:student1.num = 10010;
student1.num (“.”是成员运算符,优先级最高) 2)如果成员本身又属一个结构体类型,则要找到最
➢在定义时初始化(eg11.1)
struct student {long int num; char name[20]; char sex;
a.num=89031; a.sex=‘M’; name如何赋初值?
char addr[20];
}aa=;{89031,"Li Lin",'M',"123 Beijing Road"};
– 共用体类型定义
定义形式:
例 union data { int i; char ch; float f; };
union 共用体名
{ 类型标识符 成员名; 类型标识符 成员名;
……………. };
i ch
f
类型定义不分配内存
Байду номын сангаас
2020/10/13
17
– 共用体变量的定义
形式一: union data { int i; char ch; float f; }a,b;
从而完成将结构变量的指针传给函数。主调函数和被调函 数共用一段内存空间。
eg11.6.c
传递数组(自动实现传引用调用)和传递结构不同; 2用020指/10/针13 作函数参数能提高程序运行效率,有时节约内存。 16
• 11.8 共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
2020/10/13
10
#include<stdio.h>
#include<string.h>
struct person
{char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Fun",0}; void main()
{int i,j;
char leader_name[20];
2020/10/13…}
(1)结构体变量.成员名 (2)(*p).成员名 (3) p-> .成员名
12
eg11.3 #include<string.h> void main()
{struct student {long int num;
char name[20];
char sex;
float score;
低一级的成员,对它进行赋值或存取以及运算. student1.birthday.month student1.birthday
3)成员可以像普通变量一样进行各种运算.
student2.score= student1.score;
2020/10/1s3tudent1.age++;
6
11.4 结构体变量的初始化
:
}}
2020/10/13
15
2、结构传递(全体传递,多值传递): 用结构变量作实参
将结构变量所占的内存单元内容全部顺序传递给形参(值 传递),由于采用值传递内存开销大、在被调函数中改变 的形参值不能返回主调用函数,因此在使用上很不方便。 eg11.5.c
3、传引用调用(地址传递): 定义结构指针变量并以此指针作为实参
{10101,"LiLin",'M',18,87.5,"123 Beijing"},
{10102,“zhangfun",'M',19,99,"123 Shanghai"},
{10104,“Wang Min",‘F',20,78.5,"123 Nanjing"}};
2020/10/13
9
10101
“li lin”
长度=最长成员所占字节数
18
– 共用体变量引用
• 引用方式:
共用体变量名.成员名 共用体指针名->成员名 (*共用体指针名).成员名
u• n引ion用d规ata则 –{不能in引t i;用共用体变量,只能引a.用i 其a成.ch员 a.f – 共用ch体ar变c量h;中起作用的成员是p-最>i后一p-次>c存h放p的->成f 员
任一时刻只有一个成员存在
2020/10/13
20
例 结构体中嵌套共用体 eg11.12
struct { int num;
char name[10]; char sex; char job; union { int class;
char position[10]; }category; }person[2];
for(i=1;i<=5;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++)
2020/10/13
2020/1仅0/13在定义时可整体初始化
7
11.5 结构体数组
1 )定义结构体数组 将结构体定义中的变量定义为数组即可
struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; };
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
{10104,"Wang Min",'F',20}};
void main()
{ struct student *p;
for(p=stu;p<stu+3;p++)
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);
}
2020/10/13
stu[0] stu[1] stu[2]
10010 Li Gang M 18 87.5 Beijing
结构的定义:struct student
{int num; char name[20];
结构类型
char sex;
int age;
2020/10/13
float score;
struct student stu;
char addr[30];
14
3)用结构体变量和指向结构体的指针作函数参数
把结构传递给函数有三种方式: 单个成员 整个结构 指向结构的指针
1、成员传递:用结构变量成员作为实参(值传递)
例如:对于上面定义的结构变量stu_1有四个成员。 其中任何一个都可以做实参。
void main()
{……
{ prin(stu_1.num);
形式二: union data { int i; char ch; float f; }; union data a,b,c,*p,d[3];
形式三: union
{ int i; char ch; float f;
}a,b,c;
i ch
f
a
i ch
f
b
共用体变量任何时刻 共用体变量定义分配内存,
20只20/1有0/1一3 个成员存在
注意 (1)类型与变量是不同的概念;
2020/10/13
(2)对结构中的成员可以单独使用; (3)成员可以是结构变量;
赋值.存取.运算;在 编译时分配内存
2
11.1 概述
➢ 结构:一种构造类型数据 (一条记录)
不同类型的数据组合成一个整体,以便引用 ➢为什么引入结构型数据?
num name
sex age score addr
第十一章 结构体与共用体
构造的数据类型 • 结构体的定义 • 结构体的初始化 • 访问结构体成员 • 结构体和函数
2020/10/13
1
2、定义结构的同时定义结构变量: struct student {………
}studend1, student[2];(变量表列)
3、直接定义结构变量: struct {……… }studend1, student[2];
11
printf("%5s:%d\n",leader[i].name,leader[i].count);}
11.6 指向结构体类型数据的指针
结构体变量的指针是该变量所占内存区域的起始地址。
1) 指向结构体变量的指针
{… struct student stu1; struct student *stu1Ptr; stu1Ptr=&stu1; stu1.num=10010; (*stu1Ptr).num=10010; stu1Ptr->num=10010;
b=a; ()
x=a.f; ()
2020/10/13
19
– 结构体与共用体
• 区别: 存储方式不同 • 联系: 两者可相互嵌套
struct node
{ char ch[2];
ch
int k;
k
}a;
变量的各成员同时存在
a
union node { char ch[2];
int k; }b;
ch k
b
};
3
➢ 结构体类型的形式:
struct 结构体名
{类型名1 成员名1;
关键 类型名2 成员名2;
字
:};
这个结构就是一种 数据类型
结构体类型许多种
11.2 定义结构体类型变量的方法
2020/10/13
4
成员可以是结构变量
struct date {int month; int day; int year; }; struct student {int num; char name[20]; struct date birthday; char addr[30] ; }student1,student2;
};// stu_1 ={89031,"Li Lin",'M',89.5};
struct student stu_1; struct student *p; p=&stu_1;
stu_1.num=89031;
strcpy(stu_1.name,"Li Lin");
stu_1.sex='M'; stu_1.score=89.5;
struct student stu[3];
2020/10/13
8
2 )结构体数组的初始化
struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; };
struct student stu[3]={
printf("NO.:%ld\nname:%s\nsex:%c\nscore:%f\n",
stu_1.num,stu_1.name,stu_1.sex,stu_1.score);
printf("NO.:%ld\nname:%s\nsex:%c\nscore:%f\n",
2020/10/13
13
(*p).num,(*p).name,(*p).sex,(*p).score);}
2)指向结构体数组的指针
例 11.4
#include <stdio.h>
struct student { int num;
char name[20];
p 10101 Li lin M
char sex;
p+1
18
int age;
}stu[3]={{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19},
2020/10/13
name num sex
job
class position
Li 1011 F S
501
Wang2086 M T
prof
循环n次 读入姓名、号码、性别、职务
真
job==‘s’
假
读入class
真
job==‘t’ 假
读入 输出 position“输入错”
循环n次
job==‘s’
num name
birthday
addr
month day year
2020/10/13
5
11.3 结构体变量的引用
结构体变量不能整体引用,只能引用其成员
1) 结构体变量中成员的引用方式 结构体变量名.成员名 例如:student1.num = 10010;
student1.num (“.”是成员运算符,优先级最高) 2)如果成员本身又属一个结构体类型,则要找到最
➢在定义时初始化(eg11.1)
struct student {long int num; char name[20]; char sex;
a.num=89031; a.sex=‘M’; name如何赋初值?
char addr[20];
}aa=;{89031,"Li Lin",'M',"123 Beijing Road"};
– 共用体类型定义
定义形式:
例 union data { int i; char ch; float f; };
union 共用体名
{ 类型标识符 成员名; 类型标识符 成员名;
……………. };
i ch
f
类型定义不分配内存
Байду номын сангаас
2020/10/13
17
– 共用体变量的定义
形式一: union data { int i; char ch; float f; }a,b;
从而完成将结构变量的指针传给函数。主调函数和被调函 数共用一段内存空间。
eg11.6.c
传递数组(自动实现传引用调用)和传递结构不同; 2用020指/10/针13 作函数参数能提高程序运行效率,有时节约内存。 16
• 11.8 共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)