目录
- 一、结构体
- (一)结构体声明
- (二)结构体变量定义
- (三)结构体变量的初始化
- (四)结构体的引用
- (五)结构体数组
- 二、共用体
- (一)共用体定义
- (二)共用体类型数据的特点
一、结构体
C语言数组允许定义可存储相同类型数据项的变量,结构是 C 语言编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
(一)结构体声明
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct tag {
member-list
member-list
member-list
...
} variable-list ;
- tag 是结构体标签
- member-list 是标准的变量定义,比如 int i; 或者 float f;,或者其他有效的变量定义
- variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量
例如:一个学生的学号、姓名、年龄、成绩、地址,是相互联系的数据,在C语言中使用结构体来定义:
struct student
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //成绩
char addr[30]; //地址
};
- struct是关键字,不能省略
- student是定义的结构体类型名
- 结构体中的每一个数据,称为结构体“成员”或者“域”
- 结构体变量所占内存长度等于各成员所占内存长度之和
- 结构体变量中的各成员,在内存中顺序存放
- 结构体变量所占内存大小用运算符sizeof()计算
(二)结构体变量定义
定义结构体变量有四种方式:
1、先定义结构体类型,再定义结构体变量
例如:
struct student
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //成绩
char addr[30]; //地址
};
struct student student1,student2;
2、定义结构体类型时同时定义结构体变量
例如:
struct student
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //成绩
char addr[30]; //地址
}student1,student2;
3、直接定义结构体变量,不出现结构体名
例如:
struct
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //成绩
char addr[30]; //地址
}student1,student2;
4、成员是另一个结构体的变量
例如:
struct date //日期结构
{ int month; //月
int day; //日
int year; //年
};
struct student
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
struct date birthday;
char addr[30]; //地址
}student1,student2;
(三)结构体变量的初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
例如:
struct student
{ long int num; //学号
char name[20]; //姓名
char sex; //性别
char addr[20]; //地址
}a = { 1001,"Mary",'F',"123 Beijing Road"};
(四)结构体的引用
一般情况下,不能将结构体变量作为整体进行引用,只能引用其中的成员。
引用结构体成员方式:结构体变量名.成员名(.是成员运算符)
printf("%d",student1.num); // 正确引用
printf("%d,%s,%c,%d,%f,%s",student1); // 错误引用
当成员是另一个结构体变量时,应当逐级引用成员。
例如:
struct date //日期结构
{ int month; //月
int day; //日
int year; //年
};
struct student
{ int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
struct date birthday;
char addr[30]; //地址
}student1;
student1.num;
student1.name;
student1.birthday.month;
student1.birthday.day;
student1.birthday.year;
只有以下两种情况,可以将结构体作为一个整体进行访问:
1、结构体变量整体赋值
例如:student2 = student1;
2、取结构体变量地址
例如:print(“%p”,&student1);
(五)结构体数组
现在一个学生信息结构体要存放多个学生的信息应该怎么做?使用结构体数组。
1、结构体数组定义
例如:
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct student stu[3];//三个元素的结构体数组
2、结构体数组初始化
例如:
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}stu[3]={{1001,"Mary",'F',18,89,"Beijing Road"},{1002,"Jack",'M',19,83,"Shanghai"},
{1003,"Hare",'M',19,78,"Shengyan"}};
3、结构体数组的引用
例如:输出学生信息
#include <stdio.h>
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}stu[3]={
{1001,"Mary",'F',18,89,"Beijing"},
{1002,"Jack",'M',19,83,"Shanghai"},
{1003,"Hare",'M',19,78,"Shengyan"}
};
void main()
{
int i;
for(i=0;i<3;i++)
printf("%d %s %c %d %.2f %s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].score,stu[i].addr);
}
二、共用体
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
(一)共用体定义
必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,可以指定一个或多个共用体变量,这是可选的。
例如:
union data
{
int i;
char ch;
float f;
}a,b,c;
// 或者
union data
{
int i;
char ch;
float f;
}
union data a,b,c;
共用体所占内存长度等于最长成员所占内存的长度
共用体变量的引用和结构体类似,例如:a.i a.ch a.f b.i b.ch b.f
(二)共用体类型数据的特点
- 同一内存段可以存放几种不同类型的成员,但是在某一时刻只能存放其中一个成员数据
- 共用体变量起作用的成员是最后一次存放的成员
- 共用体变量的地址和它的各成员的地址都是同一地址