初识结构体
结构体概述:
1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
2.结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以方便日后的使用。
3.在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言无法操作数据库,所以在项目中通过对结构体内部变量的操作将大量的数据存储在内存中,以完成对数据的存储和操作。
从结构体到数组的进步之处:
1.结构体可以认为是从数组发展而来的。其实数组和结构体都算是数据结构的范畴,数组就是最简单的数据结构,结构体比数组更复杂,而我们没有讲到的链表、哈希表和图之类的数据结构又比结构体复杂。
2.通过前面的学习,我们都分析出数组有2个明显的缺陷:
第一:数组在定义的时候必须明确的给出数组的大小,而且这个大小在以后是不能改变;
第二:数组的要求所有元素的类型是一样的,
因为数组的这两个缺陷,其实也是数组的优点,我们使用数组是很容易的。
3.结构体的出现就是用来解决数组第二个缺陷的,我们可以理解为结构体是可以包含不同元素类型的数组。
结构体的使用:
结构体变量的定义方法
方法一:
// 创建结构体模板struct student
struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
};
// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;
此处,student是结构体名,该名字是由任意定义的,但是尽量起个有意义的名称。其相当于一个模板,可以使用这个模板去定义变量stu1,stu2,stu3。定义的时候不要忘了struct
方法二:
// 定义三个结构体变量stu1, stu2, stu3
struct
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}stu1, stu2, stu3;
相对于方式一,方式二就是我们可以在定义结构体的同时也可以定义相应结构体的变量,虽然更加简洁,但是因为没有名字,后面就不能使用该结构体定义新的变量了。
方法三:
// 给结构体模板struct student重新命名为student
typedef struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
// 使用student创建三个结构体变量stu1, stu2, stu3
student stu1, stu2, stu3;
此处使用typedef为结构体模板struct student定义一个别名student,关于typedef的介绍移步至#define与typedef的区别?进行查看。使用typedef给结构体创建一个别名,这在实际编程用使用非常广泛,如STM32单片机固件库中,使用得很多。
结构体变量的初始化
结构体变量的初始化的方式有很多种,下面就介绍我日常写程序的一种,也是很多程序使用的一种:
//结构体的定义
typedef struct student
{
const char* name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
int main(void)
{
student my_strect; // 定义一个结构体变量stu1
student student;
/* 给结构体变量stu1的成员进行赋值 */
student.age = 11;
student.name = "QRSBBT";
student.num = 1234568;
return 0;
}
结构体变量的访问方式
从上面的分析我们可以知道,结构体的访问方式(student .)类似于数组的下标访问,(student.)的结构体访问方式在本质上其实是指针方式的访问。
代码论证:
#include <stdio.h>
//结构体的定义
typedef struct student
{
const char* name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
int main(void)
{
student my_strect; // 定义一个结构体变量stu1
/* 给结构体变量stu1的成员进行赋值 */
my_strect.name = "QRSBBT"; // const char* p = (const char*)&my_strect.name; *p = "QRSBBT"
my_strect.num = 520; // int *p = (int*)&my_strect.num; *p = 520;
my_strect.age = 23;
//点访问方式
printf("\n============================================\n");
printf("My name is %s\n", my_strect.name);
printf("My num is %d\n", my_strect.num);
printf("My age is %d\n", my_strect.age);
printf("============================================\n");
printf("\n============================================\n");
int *p = (int *)&my_strect.num;
printf("My num is %d\n", *p);
int *A = (int *)&my_strect.age;
printf("My num is %d\n", *A);
printf("\n============================================\n");
//指针访问方式论证
return 0;
}
运行结果:
结论:
通过上面的代码测试我们可以得出在结构体中(student.)的访问方式实际上就是通过指针来访问的。