C 语言-6 结构体&共用体
6.1 定义结构体
-
在实际问题中,一组数据往往具有不同的数据类型。例如:在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构 (structure)”或叫“结构体”
-
“结构”是一种构造类型,由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型
-
结构的定义
-
一般定义形式:
struct 结构名 {成员表列};
成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明
-
成员表列定义形式:
类型说明符 成员名;
-
-
示例:
struct stu { int num; char name[20]; char sex; float score; };
-
-
结构的说明
-
先定义,后说明
//使用的上面那个示例,这里就不单独定义了 struct stu boy1,boy2;
说明了两个变量 boy1 和 boy2 为 stu 结构类型
-
也可以用宏定义使一个符号常量来表示 一个结构类型
#define STU struct stu STU { int num; char name[20]; char sex; float score; }; STU boy1,boy2;
-
-
在定义的同时进行说明
-
一般形式:
struct 结构名 { 成员表列 }变量名表列;
-
示例:
struct stu { int num; char name[20]; char sex; float score; }boy1,boy2;
-
-
直接说明
-
一般形式:
struct { 成员表列; }变量名表列;
与第二种方法的区别:第三种方法中省去了结构名,而直接给出结构变量
-
示例:
struct { int num; char name[20]; char sex; float score; }boy1,boy2;
-
-
-
上述三种说明方式都有相同的结构:
-
在上述 stu 结构定义中, 成员也可以又是一个结构,构成了嵌套的结构,如:
-
结构定义:
struct date { int month; int day; int year; } struct { int num; char name[20]; struct date birthday; float score; }boy1,boy2;
成员 birthday 被说明为 data 结构类型,成员名可与程序中其它变量同名,互不干扰
-
-
-
结构变量成员的表示方法
-
一般形式:
结构变量名.成员名
-
示例:
boy1.num; boy2.sex; //如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用 boy1.birthday.month
-
-
结构变量的赋值
-
示例:
main() { struct stu { int num; char *name; char sex; float score; } boy1,boy2; boy1.num=102; boy1.name="Zhang ping"; printf("input sex and score\n"); scanf("%c %f",&boy1.sex,&boy1.score); boy2=boy1; printf("Number=%d\nName=%s\n",boy2.num,boy2.name); printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score); }
-
-
结构变量的初始化:在定义时进行初始化赋值
-
示例:
main() { struct stu /*定义结构*/ { int num; char *name; char sex; float score; }boy2,boy1={102,"Zhang ping",'M',78.5}; boy2=boy1; printf("Number=%d\nName=%s\n",boy2.num,boy2.name); printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score); }
-
6.2 定义结构数组
-
结构数组:每一个元素都是具有相同结构类型的下标结构变量
-
用途:用结构数组来表示具有相同数据结构的一个群体
- 如一个班的学生档案,一个车间职工的工资表
-
定义方式与结构体类似,只需要将变量名表列写为数组即可
struct stu { int num; char *name; char sex; float score; }boy[5];
定义了一个结构数组 boy,共有 5 个元素,boy[0]~boy[4]。每个数组元素都具有 struct stu 的结构形式
-
初始化赋值
struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,"Li ping","M",45}, {102,"Zhang ping","M",62.5}, {103,"He fang","F",92.5}, {104,"Cheng ling","F",87}, {105,"Wang ming","M",58}; }
- 当对全部元素作初始化赋值时,也可不给出数组长度
-
示例:
#include"stdio.h" #define NUM 3 struct mem { char name[20]; char phone[10]; }; main() { struct mem man[NUM]; int i; for(i=0;i<NUM;i++) { printf("input name:\n"); gets(man[i].name); printf("input phone:\n"); gets(man[i].phone); } printf("name\t\t\tphone\n\n"); for(i=0;i<NUM;i++) printf("%s\t\t\t%s\n",man[i].name,man[i].phone); }