- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十四章 结构体、共用体和 用户定义类型
▲ 结构体数组定义与初始化 ▲ 结构体和指针 ▲ 共用体 ▲ 链表
东方一诺技术培训研发中心
• 14.6 结构体数组
– 结构体数组的定义
三种形式: 形s形ss形t式rtts{}urrt式式uus二cr{}{}ccuttutts;一三c:[tsiccit2unnssthh::utt][ttiiccicciaauu;2nnnndhhhharrddn]ttttegaaaa;sneeunaarrrreennnnamggt;xnsnsuumtteeee;;aamm;;xxemms[;;;;t2eeu0[[[222];00];]];;
num 25B name
sex age num name sex age
stu[0] stu[1]
东方一诺技术培训研发中心
– 结构体数组初始化 分–顺结行序初构初始始体化化数:: 组引用
例例sst引trru{u名s{s{c用ctttrrtuus方sicctiicntuhttnnuhtda式ttdasrenternnnunun:nuutdamtammemm;n;;ete[[2结200]构];; 体数组stu名[1][.a下ge+标+; ].成员
a.f=1.5;
char ch;
printf(“%d”,a.i); float f(;编译通过,运行结果不对)
}a;
a=1;
()
东方一诺技术培训研发中心
– 结构体与共用体
• 区别: 存储方式不同 • 联系: 两者可相互嵌套
若int占四个字节, 则变量b所占字节 数为:8
union node
{ char ch[2];
struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf("%d %d %d\n",arg.a,arg.b,arg.c); func(&arg); printf("%d %d %d\n",arg.a,arg.b,arg.c); } void func(struct data *n) { printf(“%d %d %d\n",n->a,n->b,n->c); n->a=18; n->b=5; n->c=n->a*n->b; printf("%d %d %d\n",n->a,n->b,n->c); }
st{rucitntdamteonth; { iinntt dmaoyn; th; iinntt dyaeya;r; }DAinTtE;year;
DA}TDEATbEi;rthday, *p;
struct date { int month; int day; int year; }birthday, *p;
stu1.num=101; (*p).num=101 p->num=101
东方一诺技术培训研发中心
– 指向结构体数组的指针
例 指向结构体数组的指针
p
num
struct student { int num;
char name[20];
name
sex
p+1
age
char sex;
int age;
}stu[3]={{10101,"Li Lin",'M',18},
东方一诺技术培训研发中心
• 14.9 共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
– 共用体类型定义
定义形式:
union 共用体名 {
类型标识符 成员名;
类型标识符 成员名;
…………….Байду номын сангаас};
例 union data { int i; char c; float f; };
}stu}[st]r=[i3{n]{t;…ag…e; },{…{{1111…10100101},,,“,“““{LLLL…iiiiuuGs…GtYrYacaan}apnn}gyng”(;””s”,,,‘t,‘‘uF‘MF[M’0’,]’,1’.1,n,9191a}9m}9;,}}e,;,”xiaohua”);
main()
{ void func(struct data n);
copy
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("%d %d %d\n",arg.a,arg.b,arg.c);
func(arg);
printf("%d %d %d\n",arg.a,arg.b,arg.c);
}
void func(struct data n)
{ printf("%d %d %d\n",n.a,n.b,n.c);
n.a=18; n.b=5; n.c=n.a*n.b;
printf("%d %d%d\n",n.a,n.b,n.c);
}
东方一诺技术培训研发中心
((mmaaiinn))
(aaam:::2a22i777n)
{strucichtnhatasrtrnusnsuedeamxexm;n;te[20]; {icicnnhhttaaaiarrgngnsetee;a;nxmu; em[2; 0];
}};; cinhtacarhgsaeer;xn; ame[20]; ssttrruuc}cttstsusttu[iund]dt=eecan{nhgt{tae…r;ssst…tueu[x[};],]={={…{{11…0000},,“,“{WW…aan…ngg}LL}i;inn””,,‘‘MM’’,,2200,},
c i
f
类型定义不分配内存
东方一诺技术培训研发中心
– 共用体变量的定义
形式一:
形式二:
union data
union data
{ int i; char c;
{ int i; char c;
a
float f;
float f;
};
}a,b;
union data a,b;
形式三: 共用体变量任何时刻
union 只有一个成员存在 { int i;
全部初始化时维数可s省tu[0].name=“xiaohua”;( )
东方一诺技术培训研发中心
• 14.7 结构体和指针
– 指向结构体变量的指针
• 定义形式:struct 结构体名 *结构体指针名;
例 struct student *p;
• 使str用uc结t s构tu体de指nt 针变量引用成p员形式
arg
cccabbbb::::::333233330007
aarrgg arg
c :30
((ffuunncc))
aacbb:::::12353870
nn
c :90
例 用结构体指针变量作函数参数
struct data { int a,int b, int c; }; main() { void func(struct data *n);
志
东方一诺技术培训研发中心
链表结构的定义
struct student {int data; struct student *next; }; • next为struct student类型指针变量,指向下一 个结点。
东方一诺技术培训研发中心
例 定义结构体类型 例 定ty义pe结d构ef体s变tr量uct date
b
共c用ha体r c变; 量定义分配内存,
长f度loa=t最f;长成员所占字节数
}a,b,c;
c i f
c i f
东方一诺技术培训研发中心
– 共用体变量引用
• 引用规则
– 不能引用共用体变量,只能引用其成员 – 共用体变量中起作用的成员是最后一次存放的成员
例 a.i=1; 例 union
a.ch=‘a’; { int i;
东方一诺技术培训研发中心
本节总结:
• 重点: 结构体数组的定义和应用 链表
• 难点: 结构体指针
• 易混淆点: 结构体和共用体所占字节数
东方一诺技术培训研发中心
作业:
• 结合盘上的题留题
东方一诺技术培训研发中心
int k;
struct node { float f; int m; }a;
}b;
东方一诺技术培训研发中心
• union tt
{ int i;
char ch[2];
} a;
a.ch[0]=13;a.ch[1]=1;
ch[1]
ch[0]
0 0 0 0 0 0 01 0 0 0 01 1 0 1
i =269
{10102,"Zhang Fun",'M',19},
{10104,"Wang Min",'F',20}};
main()
{ struct student *p;
p=stu;
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);
p++;
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);
(*结构体例指针in名t{).成n员;icnh名tarnnuamm结; e构[2体0]指; 针名->成员名 int *pc=h&arn;sex;