一、结构体类型
<一>、定义
构造一个新类型,把需要用到的数据类型组合在一起,并且占用空间内存。
<二>、结构体的声明与定义
struct 类型名{
int id; //定义变量
char name[32]; //定义变量
……
} ;//也可以在花括号后,分号前定义结构体变量
int main(){
struct student stu1={123,"刘备"}; //定义结构体变量stu1以及初始化
printf("%d %s",stu1.id,stu1.name); //输出stu1保存的数据
}
注意:1、结构体变量可以相互赋值
struct student stu2=stu1;
2、访问成员时
要单独赋给其中一个结构体变量的成员时,即访问结构体变量时,要细心:成员名不能单独访问,正确格式为:stu1.id=123;这是其一;第二是想好如何给值,如示范中的name是数组名,数组名是常量,应该使用string.h库中的拷贝函数:strcpy(stu1.name,"刘备");
3、结构体可以套娃
//结构体的套娃
//学生类型
struct student
{
int s_id;//学号
char s_name[32];//姓名
float s_score;//成绩
};
//老师类型的声明
struct teacher
{
int t_id;//老师编号
char t_name[32];//老师姓名
struct student stu;//老师所带的学生
};
//班级类型的声明
struct Class
{
int c_id;//班号
struct teacher t;//带班老师
};
struct Class C;//定义班级里的c变量。可以通过班级,找到班级里面的学生
C.t.stu.s_id = 125;
printf("%d\n", C.t.stu.s_id);
}
<三>、结构体数组
1,定义格式
数据类型 数组名[数组长度];
2,初始化
数据类型 数组名[数组长度]={初值1,初值2,初值3……};//里面的初值需要按顺序赋
都要记得分号,这是“一句话”。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct students {
int id;
char name[32];
float score;
};
int main() {
struct students stu[3] = { //这里的结构体数组每一个变量都包含三个数据,可以采用花括号嵌套花括号的格式将其初始化。
{123,"刘备",99.9f},
{124,"关羽",87.9f},
{125,"张飞",98.9f}
};
for (int i = 0; i < 3; i++) { //利用循环输出各个数组值
printf("%d %s %.2f\n", stu[i].id, stu[i].name, stu[i].score);
}
}
<四>、typedef取别名
1.格式
typedef 类型名 别名;
typedef struct student STU;
STU stu2 = {111,"左左",100.0f};
2.结构体类型的另一种格式
typedef放在构造数据类型的地方
typedef struct student {
int id;
char name[32];
float score;
}STU;//STU是别名,这里要与定义变量时区分开来
<五>、结构体大小(了解计算机是如何占用内存的,对于提高程序运行效率有帮助)
对齐机制:往最大的类型对齐(最大的类型不包括构造类型、数组)
struct student2//学生类型
{
int id;//学号 占4字节
double score;//成绩 占8
char ch;//字符型占1
};
//对齐机制:往最大的类型对齐(最大的类型不包括构造类型、数组)
printf("%d\n", sizeof(struct student2));
总结:构造数据类型时,把大类型 放在前面 。从大到小往下放,很大程度上是节省内存空间的
二、共用体类型
与结构体唯一的不同——内存结构
(了解即可,共同体的使用一般只出现在嵌入式里)
三、枚举类型
1、枚举类型的声明格式
enum 枚举类型名{枚举列表};
//例如周列表
enum Week{sun,mon,tue=20,wed,thu,fri,sat};//枚举元素尽量用英文
2、枚举元素
是常量。没有在列表里赋初值是默认sun=0,后面的元素值,根据上一个枚举元素的值,+1
3、枚举类型
特殊的整型
4、作用
增强代码的可读性和可维护性
enum diretion{up='w',down='s',left='a',right='d'}dir;//上下左右
int main(){
while (1)//人物不断的移动
{
dir = (enum diretion)getchar();//左右两边要类型相同,这里对右边进行强制转化,转化成和枚举型一样特殊的整型
switch (dir)
{
case up:
printf("人物往上走了\n");
break;
case down:
printf("人物往下走了\n");
break;
case left:
printf("人物往左走了\n");
break;
case right:
printf("人物往右走了\n");
break;
}
}
}
增加代码可读性,如检测代码是否成功运行
enum RETURN{return_ok=0,return_bad=-1};
//检测 a是否异常 a==0异常(-1) a!=0正常(0)
RETURN check(int a) //返回值类型记得写成定义的枚举类型,enum是用来声明与定义枚举类型的,不要添上去
{
if (a == 0)
{
return return_bad;
}
else
{
return return_ok;
}
}