目录
结构体
结构体的声明
定义结构体变量
访问结构体成员进行初始化
通过结构体变量名访问结构体成员
结构体指针
结构体指针的定义
通过结构体指针访问结构体成员
结构体数组
结构体数组的定义
遍历结构体数组
结构体的长度(笔试重点)
上一篇复习了最后6道编程题,这一节开始复习结构体的内容。
说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。
这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。
注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。
我们正式开始:
结构体
为什么要学习结构体?
我们以往存储数据都是用数组来存储的,但是数组有个缺点就是存储的数据的类型必须是一样的。如果我们想要存储一个人的信息,比如,身高、年龄等,身高是浮点型,年龄是整型,那这种数据用数组来存储是不行的,因此我们需要学习结构体。
结构体的声明
struct的语法格式如下:
struct 结构体名 {成员表列}; //分号不能丢
比如:
struct student
{
int num;
char name[20];
float score;
char addr[30];
} ; //注意:这个分号不能丢
注:struct是一个关键字,结构体内部的各变量为结构体成员。
结构体声明后之后可以定义结构体变量:
定义结构体变量
例如:struct student s1;
定义结构体变量初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
例如:struct student s2={“jack”,1,’m’};
访问结构体成员进行初始化
通过结构体变量名访问结构体成员
我们前面的s1没有初始化,如果你想要让它初始化时,可以通过“结构体变量名.成员名”来访问结构体中的成员,例如:s1.id=2; s1.sex=’f’;
注意:如果要通过结构体变量名来访问数组成员进行初始化,不能直接写成s1.name=”tom”;//这样写等价于char name[32];name=”aaa”;由于name数组名是个地址常量,因此不能被修改。
可以这样写:strcpy(s1.name,”tom”);
也可以在结构体声明时直接初始化:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
如果嫌结构体的声明部分太长,可以将结构体声明改个名字:
例如:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}stu ;
这样我们就把
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
这么一大串改成了stu。
通过结构体变量名输出结构体成员,只能一位一位输出,例如:printf(“%s %d %c\n”,s1.name, s2.id, s1.sex);
结构体指针
结构体指针的定义
结构体指针应该指向结构体变量,我们要先申请一块内存给结构体变量,然后再让结构体指针指向这块内存。
stu *ps=(stu*)malloc(sizeof(stu)*1);
通过结构体指针访问结构体成员
通过“结构体指针变量名->成员名”来访问结构体成员并初始化
ps->id=3;
ps->sex=’m’;
注意:如果是访问数组成员,应写成strcpy(ps->name,”boy”);
如果要通过指针输出结构体成员,应该写成例如:printf(“%s %d %c\n”,ps->name, ps->id, ps->sex);
结构体数组
结构体数组的定义
数组中的每个元素都是一个结构体
例如:
stu s3[5]={{“aa”,4,”f”},{”bb”,5,’f’}};
遍历结构体数组
int i;
for(i=0;i<5;i++)
{
printf(“%s %d %c\n”,s3[i].name,s3[i].id,s3[i].sex);
}
结构体的长度(笔试重点)
计算结构体的长度有两个原则:
- 结构体的总长度一定是最长成员的数据类型的整数倍;
- 每个成员的偏移量一定是该成员长度的整数倍;
例如:
struct test
{
int a;
int b;
char c;
char d;
} ;
这样运行出来的结果是12
因为该结构体有4个成员,要保证结构体的总长度一定是最长成员的数据类型的整数倍,因此要在后面补两个字节。
如果我们将该结构体成员调整一下顺序,
例如:
struct test
{
int a;
char c;
int b;
char d;
} ;
这样运行出来的结果是16
因为char后面是int,为了保证int偏移量是自己的整数倍,因此char后面要空出三个字节,然后又由于int是最长成员,为了保证int总长度是int的整数倍,因此在后面补3个字节,所以总长度是16
但是笔试的时候会有更加复杂的情况,比如结构体中嵌套结构体
例如:
struct test 2
{
int z;
struct test t;
char e;
};
注意:不要以为总长度是struct test t长度的整数倍,我们计算的时候还是要把struct test t拆开,最长成员还是int。计算的时候要保证struct test t在内存中的完整性,不能拆开。
这样运行的结果是24
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!