第11章结构体及共用体
14
3)用结构体变量和指向结构体的指针作函数参数
把结构传递给函数有三种方式: 单个成员 整个结构 指向结构的指针
1、成员传递:用结构变量成员作为实参(值传递)
例如:对于上面定义的结构变量stu_1有四个成员。 其中任何一个都可以做实参。
void main()
{……
{ prin(stu_1.num);
低一级的成员,对它进行赋值或存取以及运算. 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、传引用调用(地址传递): 定义结构指针变量并以此指针作为实参
例 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;
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
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
{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”
};// stu_1 ={89031,"Li Lin",'M',89.5};
struct student stu_1; struct student *p; p=&stu_1;
stu_1.num=89031;
strcpy(stu_,"Li Lin");
stu_1.sex='M'; stu_1.score=89.5;
➢在定义时初始化(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"};
{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]
printf("NO.:%ld\nname:%s\nsex:%c\n,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);}
形式二: 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 个成员存在
num name
birthday
addr
month day year
2020/10/13
5
11.3 结构体变量的引用
结构体变量不能整体引用,只能引用其成员
1) 结构体变量中成员的引用方式 结构体变量名.成员名 例如:student1.num = 10010;
student1.num (“.”是成员运算符,优先级最高) 2)如果成员本身又属一个结构体类型,则要找到最
– 共用体类型定义
定义形式:
例 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;
第十一章 结构体与共用体
构造的数据类型 • 结构体的定义 • 结构体的初始化 • 访问结构体成员 • 结构体和函数
2020/10/13
1
2、定义结构的同时定义结构变量: struct student {………
}studend1, student[2];(变量表列)
3、直接定义结构变量: struct {……… }studend1, student[2];
长度=最长成员所占字节数
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 员
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
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];
};
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;
任一时刻只有一个成员存在
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];