目录
一、结构体
这是我要讲解数据类型的第一个类型
而int、float那些简单的就省略了
结构体的应用很多
数据结构就是其中一个应用,例如我们熟知的链表
之所以使用结构体
很大程度上是方便程序猿管理多个变量,且可以是不同类型的变量
使得代码的可读性增强
例如我们用一个结构体描述一个学生的信息(名字、性别、学号)
struct student{
char name[20]; //名字
bool gender; //性别
char stuNum[10]; //学号
};
可见,结构体的方便之处!
二、结构体类型声明:
struct 结构体名称 {
成员类型1 成员名1;
成员类型2 成员名2;
...
};
注意⚠️:这是数据类型的声明,不是变量的定义!
数据类型和变量一定要分清楚
并理解它们的意义
好了现在有了数据类型
我们尝试去定义一个变量吧
三、定义一个结构体变量:
struct 结构体名称 变量名;
<struct 结构体名称> 这里就是结构体数据类型
<变量名>这里就是结构体变量
四、访问结构体成员:
变量名.成员名
注意⚠️:假如这个结构体变量是一个结构体指针变量,则访问它的成员时用箭头 ->
后续的篇章我们会讲解 结构体指针
五、初始化方法:
方法1 <先声明再定义后初始化>
//1.数据类型的声明
struct Student {
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);//pfun是一个函数指针变量,它指向一个函数地址(函数名)
};
解析:
<pfun>是一个函数指针变量,<void (*)(int,int)>是它的数据类型
它指向一个函数地址(函数名)
后续会讲解 函数指针
//2.定义变量
struct Student stu;
//3.变量的初始化
strncpy(stu.name,"zhangsan",sizeof(stu.name));
stu.age = 20;
stu.gender = 1;
pfun = func;
解析:
strncpy是string家族中的strcpy的另一个版本
最后一个参数指的是 覆盖内容的大小(单位:字节)
方法2 <定义的同时初始化>
//1.数据类型的声明
struct Student {
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);
};
//2.定义的同时初始化
struct Student stu = {"zhangsan",20,1,func};
方法3<类型声明同时定义并初始化>
//声明并定义一个变量
struct Student {
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);
}stu;
或者(推荐)
//声明并定义一个变量同时初始化
struct Student {
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);
}stu = {"zhangsan",20,1,func};
或者
//声明并定义一个变量同时初始化,但是这种方法很少用,建议不用,因为只能定义一次
struct{
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);
}stu = {"zhangsan",20,1,func};
方法4 <定义的同时初始化、GNU特有>
//1.数据类型的声明
struct Student {
char name[20];
unsigned char age;
unsigned char gender;
void (*pfun)(int,int);
};
//2.定义同时初始化,GNU特有
struct Student stu = {
.name = "zhangsan",
.age = 20,
.gender = 1,
.pfun = test1
};
六、定义结构体时的内存分配
平时,我们定义了多少变量
似乎不太影响
但是当硬件资源不足时
就要开始对内存分配斤斤计较了
而且作为程序猿
要站在内存上看代码
你定义了一个变量,内存是怎么分配给它的?
这不仅是一种思想
还是一个良好的编程习惯
我们来看一下这个结构体数据类型
请问它定义的变量在内存中占多少字节?
struct demo{
int a; //4
char b; //1
unsigned c; //1
int d; //4
};
答案是12字节
原因在于C语言对struct中成员的内存分布
不管内部成员是什么数据类型都以4字节为单位来申请
每申请的4字节还剩下的能用继续用
不够用时再次申请4字节
并在新的4字节里重新开始分配
当分配到d时,只剩下2字节了,显然不够用
所以再重新申请4字节,并在新的字节上开始分配
可知,这样定义浪费了2字节空间大小的内存
所以,要站在内存上看代码
养成好的习惯
将来对自己的代码优化或改进提供一种方法
整理不易
点赞收藏关注喔~