一、结构体的引入
在学习结构体之前,我们已经学习过了char、short、int、long、float、double、long long等等的一些基本数据类型,所谓的接结构体就是把几个中数据类型组合在一起组成一个新的数据类型,例如一个学生的信息需要姓名(字符串)、学号(字符串)、年龄(整型)等基本数据类型组成,所以这样的一个数据类型就叫做结构体。
二、结构体的定义与使用
1、结构体的定义
struct 结构体名称
{
//成员列表;
};
例如:定义一个学生基本信息的结构体,命名为Student,里面包含了学生的姓名、性别、学号、 年龄等基本信息
struct Student
{
char name[10];//姓名
char sex[10];//性别
int number;//学号
int age;//年龄
};
1.1结构体类型重命名:
基本格式:
typedef struct Student
{
}Student,stu;//通过typedef关键字将struct Student类型重命名为Student和stu
在进行了类型重命名后可以通过以下三种方式定义相应的结构体类型变量:
struct Student s1;//未进行类型重命名前的定义变量
Student s2;
stu s3;
2、结构体的初始化
1.1结构体的成员访问
结构体变量名.成员名
例如在上面的例子中想要访问学生信息结构体中的学号和年龄,通过以下方式来实现:
stu.number;//通过stu.成员名来访问结构体里面的学号
stu.age;//通过stu.成员名来访问结构体里面的年龄
1.2结构体变量的初始化
struct Student stu = {"lisi" , "男" , "001" , "20"};//c语言中常见的赋值方式
stu.name = "wangwu";//error 这种赋值方式是错误的,这种赋值方式就等价于数组里面的arr="wangwu";
//char arr[10];arr是首元素地址,是一个常量,不可以直接等号赋值;
strcpy(stu.name,"wangwu");//正确的赋值方式应该是这样,通过拷贝函数来进行该变量的赋值
3、结构体与数组
在以上的举例中,我们都只是定义了一个结构体变量,但在实际中,可能会遇到定义多个结构体变量的情况,这个时候就得定义一个结构体数组来储存多个信息
3.1结构体数组定义
typedef struct Student
{
char name[20];//姓名
int id;//学号
int age;//年龄
}Student;//定义一个名为Student的结构体
Student stu[3];//定义一个结构体数组,长度为3,相当于要储存三个学生的信息
3.2内存图解
3.3内存初始化
//内存初始化为0
char* p = (char*)stu;
for(int i = 0; i < 3*sizeof(Student); i++)//第一种方式
{
*(p+i)=0;
}
memset(stu, 0, 3*sizeof(Student));//第二种方式
4、结构体与指针
4.1结构体指针的定义
typedef struct Student
{
char name[10];//姓名
int age;//年龄
}Student;//定义了一个名为Student的结构体
Student stu = {"lisi" , 10};
Student *p = &stu;//定义了一个指针指向结构体
4.2成员的赋值方式
stu.age = 20;//常规的赋值方式
(*p).age = 20;//与上一种方式表达同样的意思,由于.的优先级高于* 所以*p必须加括号
p->age = 20;//该方式也表达同样的意思 但在之后的学习中使用较多
当对该结构体中的姓名进行赋值时,需要注意的是该使用strcpy();拷贝函数来赋值
例如:
strcpy((*p).name,"wangwu");
strcpy(p->name,"wangwu");//或者
三、枚举
1、枚举类型的定义
enum 枚举名 //基本格式
{
元素1,
元素2
......
};
//枚举银行
enum bankType
{
cxk,
xyk,
jsk,
nsk
};
//枚举棋子颜色
enum ChessKind
{
Blank,
White,
Black
};
注:元素与元素之间使用逗号分隔,最后一个元素结束后不使用逗号
这里的常量都是有默认值的,默认从0开始,例如上面的Blank的值为0,White的值为1,Black的值为2,当然,里面的常量也可以赋初值:
//枚举棋子颜色
enum ChessKind
{
Blank=-1,
White,
Black
};
这样赋值后White的值变为0,Black的值为1
2、枚举类型的使用
假如定义了一个枚举类型:
enum Chesskind{};
kind = 0; error 枚举类型的赋值必须使用枚举类型里面的值
kind = Blank; right
使用地方:多分支语句
举例如下
......
switch(kind)
{
case Blank: break;
case White: break;
case Blank: break;
default;
}
......