lecture 12 一结构、联合、枚举 绳伟光 上海交通大学微纳电子学系 2017年04月14日 ERS
lecture 12 —— 结构、联合、枚举 绳伟光 上海交通大学微纳电子学系 2017年04月14日
内容 ■结构 ■联合 ■枚举 君 2
结构 联合 枚举 内容 2
结构(Structure) 结构是另一种聚集类型,与数组有如下区别: 结构的组成元素称为成员(members),成员的类型 不必是相同的 结构的每个成员都有名字,各成员是通过名字访问 的,而不是像数组通过位置访问 ■在其它一些语言中,结构也被称作记录 (records)),其成员被称作域(fields) ■结构适合将一些有关联的数据组织为一个整体
结构(Structure) 结构是另一种聚集类型,与数组有如下区别: 结构的组成元素称为成员(members),成员的类型 不必是相同的 结构的每个成员都有名字,各成员是通过名字访问 的,而不是像数组通过位置访问 在其它一些语言中,结构也被称作记录 (records),其成员被称作域(fields) 结构适合将一些有关联的数据组织为一个整体 3
声明结构变量 ■下面声明两个结构变量part1和 : part2,存储仓库中零件信息: 2000 2001 struct number 2002 int number; 2003 char name [NAME LEN+1]; int on hand; 2004 partl,part2; name 2029 右侧为part1的内存映像 2030 必各个成员依次存储 2031 numberp占据4个字节 on hand 2032 %name占据25个字节 2033 on_hand占据4个字节 4
声明结构变量 下面声明两个结构变量part1 和 part2,存储仓库中零件信息 : 右侧为part1的内存映像 各个成员依次存储 number占据4个字节 name占据25个字节 on_hand占据4个字节 struct { int number; char name[NAME_LEN+ 1]; int on_hand ; } part1, part2 ; 4
结构的抽象 结构可以按照下面两种方式予以图示: number name number name on hand on hand ■ 每个结构表示一个新的作用域(Scope),也就是说,每 个结构开始了一个新的名字空间(Name Space),该空 间中的名字不会与其它空间的同名名字冲突 5
结构的抽象 结构可以按照下面两种方式予以图示: 每个结构表示一个新的作用域(Scope),也就是说,每 个结构开始了一个新的名字空间(Name Space),该空 间中的名字不会与其它空间的同名名字冲突 5
结构的名字空间示例 如下两类结构中的同名成员不会冲突: struct int number; char name [NAME_LEN+1]; int on hand; partl,part2; struct char name [NAME LEN+1]; int number; char sex; employee1,employee2; 6
结构的名字空间示例 如下两类结构中的同名成员不会冲突: struct { int number; char name[NAME_LEN+1]; int on_hand; } part1, part2; struct { char name[NAME_LEN+1]; int number; char sex; } employee1, employee2; 6
结构变量的初始化 结构变量同样可以在声明时初始化: struct int number; char name [NAME LEN+1]; int on hand; part1 {528,"Disk drive",10}, part2 {914,"Printer cable",5}; part1的内存映像: number 528 name Disk drive on hand 10 7
结构变量的初始化 结构变量同样可以在声明时初始化: part1的内存映像: struct { int number; char name[NAME_LEN+1]; int on_hand; } part1 = {528, "Disk drive", 10}, part2 = {914, "Printer cable", 5}; 7
结构变量的初始化(续) 结构初始化中的表达式必须是常量表达式(C99放松了 此限制) ■可以只初始化部分成员, 剩余成员默认进行0初始化 C99也支持结构的指定初始化 {number 528,name "Disk drive",.on_hand 10} 指定初始化式中点和其后的成员名称一起称为指示器 (designator) 指定初始化时各成员初始化顺序不重要 两种初始化方式可混用 number 528,"Disk drive",on hand 10) 如初始化器出错未能完成初始化,则进行0初始化
结构变量的初始化(续) 结构初始化中的表达式必须是常量表达式(C99放松了 此限制) 可以只初始化部分成员,剩余成员默认进行0初始化 C99也支持结构的指定初始化 指定初始化式中点和其后的成员名称一起称为指示器 (designator) 指定初始化时各成员初始化顺序不重要 两种初始化方式可混用 如初始化器出错未能完成初始化,则进行0初始化 {.number = 528, .name = "Disk drive", .on_hand = 10} {.number = 528, "Disk drive", .on_hand = 10} 8
访问结构成员 访问结构成员:结构变量名+''+成员名 printf("Part number:%d\n",part1.number); printf("Part name:%s\n",part1.name); printf("Quantity on hand:%d\n",part1.on_hand); 结构成员可以作为左值 part1.number =258;/changes spart1's part number part1.on hand++;/increments part1's quantity on hand 点号在C中是一个实实在在的运算符,其优先级高于 几乎所有运算符,比如如下的访问没有任何问题,' 的优先级高于&: scanf("%d",&part1.on_hand); 9
访问结构成员 访问结构成员:结构变量名+'.'+成员名 结构成员可以作为左值 点号在C中是一个实实在在的运算符,其优先级高于 几乎所有运算符,比如如下的访问没有任何问题,'.' 的优先级高于'&': printf("Part number: %d\n", part1.number); printf("Part name: %s\n", part1.name); printf("Quantity on hand: %d\n", part1.on_hand); part1.number = 258; /* changes part1's part number */ part1.on_hand++; /* increments part1's quantity on hand */ scanf("%d", &part1.on_hand); 9
结构赋值 结构变量可直接用于赋值: part2 part1; ■ 结构赋值的语义是逐成员复制到对应成员 讲到数组时说数组不可以直接互相赋值,但数 组作为结构成员时是可以用=赋值的,因此有 下述惯用法: struct int a[10];a1,a2; a1 a2;/legal,a1 and a2 are structures ■上述定义的结构称为哑(dummy)结构 10
结构赋值 结构变量可直接用于赋值: part2 = part1; 结构赋值的语义是逐成员复制到对应成员 讲到数组时说数组不可以直接互相赋值,但数 组作为结构成员时是可以用=赋值的,因此有 下述惯用法: 上述定义的结构称为哑(dummy)结构 struct { int a[10]; } a1, a2; a1 = a2; /* legal, a1 and a2 are structures */ 10