目录
一、结构体的声明
1.1结构体基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2结构体声明
结构体格式
struct a
{
//声明变量
};
结构体基本声明:列如描述一个学生
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
结构体特殊声明 :匿名结构体类型
因为没有声明只能使用一次,再次使用时就会找不到
struct
{
int a;
char b;
float c;
}x;//创建一个x结构体变量
1.3结构的自引用
在结构中包含一个类型为该结构本身的成员
struct Node
{
int data;
struct Node* next;
};
自引用误区1:使用重命名的方式自引用
代码是自上而下运行的,这时还没有重命名为Std,会造成Std未声明的错误
typedef struct Node
{
int data;
Std* next;
}Std;
正确的引用
typedef struct Node
{
int data;
struct Node* next;
}Std;
自引用误区2:引用本身变量
引用本身变量会造成一直引用,从而死循环
struct Node
{
int data;
struct Node next;
};
1.4结构体变量的定义和初始化
结构体定义的方式:
1、声明类型的同时定义变量
2、用结构体定义变量
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2={1,2}; //定义结构体变量p2并初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
重命名结构体在定义变量(简单明了)
typedef struct Stu //typedef重命名
{
char name[15];//名字
int age; //年龄
}Student;//重命名为Student,而不是创建一个变量
Student s1={"zhangsan",18};
1.5结构体传参
结构体传参:
1、直接传结构体本身
2、传结构体地址
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的
下降。所以建议选用传地址的方式!
二、枚举
2.1枚举简介
枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举。
性别有:男、女、保密,也可以一一列举。
月份有12个月,也可以一一列举
2.1枚举类型的定义
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值
例如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
2.2 枚举的优点
为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
2.3枚举的使用
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;
三、联合体
3.1 联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算联合变量的大小
printf("%d\n", sizeof(un));
3.2 联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
union Un
{
int i;
char c;
};
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
这里可以看到两个结果是一样的,所用两个变量共用一个内存空间
四、总结
以上就是对结构体、枚举、联合体的基本总结
介绍了结构体、枚举、联合体的基本使用方法