一、结构体
类似于java中的类:
1、定义方法:
1)、先定义再创建变量:struct 类名{}; struct 类名 变量名;
2)、定义类型的时候顺带创建变量 : struct 类名{} 变量名1,变量名2;
3)、定义的时候没有类名然后直接定义变量: struct {} 变量名1,变量名2;
2、初始化变量:在上面定义变量的后面直接加上 = {结构体内部变量的值}
比如: struct stu{char *name;int age} stu1 = {"测试",12};
或者创建变量后再操作成员变量赋值
3、结构体成员变量的使用: 结构体变量名.成员变量名 也可以通过 &结构体变量名.成员变量名 来操作
指针类型:要创建一个指针类型结构体需要先创建一个结构体变量,然后创建一个指针指向他的地址才行,需要两步走。
如果是结构体变量是指针变量时通过 指针变量名->成员变量名 或者 (*指针变量名).成员变量名
3.1堆区结构体变量 ===============也就是说不上上述方式先创建变量再指定指针的方式,而是直接创建结构体指针的方式:
struct 类名 *变量名 = (struct 类名 *)malloc(sizeof(struct 类名));就可以了。
用法上述已经说明
3.1结构体嵌套指针变量=========================================================再说 可能有坑
4、结构体数组:创建一个数组,里面的类型是结构体的,创建定义;
struct 类名 数组名[] = {{结构体数据1},{结构体数据2}};
5、结构体嵌套结构:
结构体里面成员变量是另外一个结构体类型
struct 类名1{};
struct 类名2{char *name;struct 类名1 变量名1,struct 类名1 变量名2}
这种类型的结构体创建变量并初始化的时候,里面的初始化的值可以按照所有变量依次顺序写进去就行,初始化值不用再封装。
比如上面的初始化就用
{名称,变量1的变量值列表,变量2的变量值列表}
当然也可以把里面结构体的值用{}括起来一层
创建结构体数组初始化一样的,只要在数组后面={每个结构体的值列表} 也可以像4中给每个数据用括号括起来也行
6、结构体赋值:把一个结构体变量赋值给另个结构体变量
两个结构体的数据互不影响,都是独立的,改变一个不会影响另一个,哪怕里面是嵌套结构体也是独立的
7、结构体做函数参数和结构体指针做函数参数
当结构体变量做参数的时候,修改数据不影响外面的数据,只用当传递结构体的指针& 给结构体指针*
参数的时候里面做的修改才能影响外面的数据
8、用结构体数组名做函数参数的时候,可以修改的数据影响外面的数据
函数里用数组名++的形式来将指针指向下一条数据,成员变量的使用
也是用 数组名->成员变量名的形式 就行
还有另外一种传参也是会改变外面的数据:形参用 变量名[]的形式
在使用的时候用变量名[下标].成员变量来使用就行
9、用const修饰的结构体: 如果是普通变量,无论const在struct前面还是在变量名前面,都无法重新指定也无法修改里面的值
如果是指针变量:
分两种情况:
const 修饰在变量名上,结构体变量中的值可以改变,但是结构体变量不能重新指定
const修饰在 struct最前面 结构体内部变量的值不能改变,但是结构体变量可以重新指定
二、共用体(联合体)
共用体所有成员的首地址一样的,共用体的大小等于最大成员类型的大小,一个成员赋值会影响其他成员变量
定义:
union 共用体名{
unsigned char a;
unsigned int b;
unsigned short c;
};
定义变量: union 共用体名 变量名;
三、枚举
用法举例:
enum weekday{
sun=2,mon,tue
};
eunm bool{ false,true };
使用:
enum weekday a,b;
a=sun; b=mon;
可以给枚举中的项设置值,每个都设置,也可以只设置头一个,后面的自动依次加1
如果都不设置,默认头一个的值就0 后面的依次1,2,3
然后 %d打印枚举打印的就是 具体的数字了
四、typeof : 给数据类型(基本类型或者自定义类型)定义一个别名,然后用这个别名来创建定义变量就行了
与#define是不同的:
typeof仅限于数据类型
define发生在预处理截断,typeof发生在编译阶段
typeof int myInt;然后就能用myInt定义整型变量了
myInt a = 12;