hello,又是充满干劲的一天,今天我来分享自定义数据类型的笔记记录,一起加油!!
若有问题欢迎指正!
一.结构体
1.作用:结构体的使用可以更好地将各种信息绑定在一起成为一个整体,故可以更好地实现对复杂信息的修改与管理。
2.结构体的定义方式:
struct 结构体名字(标识符)
{
//定义成员(用来存储数据的变量)
int a;
double b;
//如上定义两个成员,那么表示这个结构体能够存储以上两个数据 };
3.定义结构体变量的方式以及结构体的初始化:
eg1:struct Student stu2 = { 1,"熊二",12,{10,10} };//结构体Student已经在上方定义过的前提下
eg2: 可以不先定义结构体名字,直接在一个地方声明结构体加定义变量加初始化,不过以后就必须再这样操作才能定义一个新的结构体变量了,而上方的结构体定义可以再次使用来定义变量。
实例:
struct
{
int x;
int y;
}n1 = {1,2}, n2, n3;
4.访问成员方式:访问成员的方式,通过结构体变量 .(点) 成员进行访问
5.结构体大小计算的时候需要考虑内存对齐,即开辟空间时开辟最大类型的空间来容放结构体中的内容,故结构体的大小会是结构体最大成员数据类型的整数倍。
也正是由于这个原因,结构体内部定义的内容需要将最大类型的变量定义在最前面或者最后面来使存放空间最小化
当在其中定义数组时,相当于定义多个变量,比如定义字符型数组时,定义一个char a[10]相当于定义了十个char型变量,而非将数组视为一个整体来计算大小6.注意事项:
(1)C语言中定义结构体的时候,不要在定义的时候用=号初始化
(2)C语言中定义结构体不能在结构体中定义函数
(3)C语言中定义结构体最少要一个成员
(4)结构体定义时可以嵌套,访问方式就变为连续使用.来进行访问了
eg:
struct Info
{
int x;
int y;
};
struct Student
{
int id;
char name[100];
int age;
struct Info stuInfo;
};
int main()
{
struct Student stu2 = { 1,"熊二",12,{10,10} }; //里面嵌套那个大括号就代表是info结构体的赋值
printf("%d %s %d %d %d\n", stu2.id, stu2.name, stu2.age, stu2.stuInfo.x, stu2.stuInfo.y);
return 0;
}
(5)只有定义数组的时候可以初始化,之后就不可以再单独拎出来初始化,可以循环赋值,但这就不叫初始化了;另外,由于存储字符串时不可以循环赋值,故字符串不可以在定义数组后再赋值给字符数组,但这种就可以使用函数strcpy来进行赋值了,eg:strcpy(char name[],"张三")
7.typedef可以给类型取别名:
eg1:typedef int 整形
eg2:
typedef struct pos
{
int x, y;
}POS,POS2; //POS,POS2是这个结构体的别名
也可以写为:
struct pos
{
int x, y;
};
typedef struct pos POS;
在7的基础上可以实现将结构体赋值给结构体:
POS p1 = { 1,2 };
POS p2 = p1; //把p1里面的值赋值给p2
8.结构体数组:(在7的基础上)
POS strPos[10] = { {1,2},{3,4} }; //结构体数组
strPos[0].x = 10;
printf("%d %d", strPos[1].x, strPos[1].y);
输出即为3 4;
9.结构体变量的初始化:
struct Student stu1 = { 0 }; //定义结构体变量
结构体变量的初始化可以像数组一样初始化,按照顺序在大括号内一个一个赋值
{0}这种形式表示里面的数据全部初始化为0
10.可以用scanf来赋值结构体,eg:scanf("%d %s %d", &stu1.id, stu1.name//这是数组, &stu1.age);
二.共用体(联合)
和结构体用法一样,不过将struct换为了union,不过特点和结构体不一样,联合是开辟一块定义时最大类型所占空间的大小来存定义时的所有数据,即一块内存被多方面共用,且其存储时同一时间只可存其中一个,在存别的时原来的数据会被覆盖,导致原来存储的无法访问
三.枚举
枚举是相当于给变量的取值范围,枚举出确定的值来规定取值范围,用enum来定义枚举类型
如果存在定义枚举的时候赋值了枚举项,那么后面一项等于前面一项的值+1,若不赋值则默认第一项是0,后面依次加一
enum Week { day1, day2, day3, day4, day5, day6, day7 };
enum {mon,tue};//这种不是取值范围,但也可以当做值用于之后的程序