一.结构体的概念🚀
结构体是一些值的集合,这些值称作成员变量,这些成员变量可以是不同的类型。
二.结构体的创建与定义🏰
一个结构体类型是由我们自己来声明创建的,我们要声明结构体的所含成员。
1.结构体的创建
struct Book//struct是结构体关键字
{
char name[20];
int price;
};
在上述代码中,我们就创建了一个名为struct Book的结构体类型,它的成员为字符数组name和整型price。
2.结构体的定义
类似于int类型,char类型,上述的struct Book也是一种变量的类型,只不过这是我们自己创建的类型,在我们创建好一个结构体类型后,我们就可以去使用这个类型去定义结构体变量了。
与其他的变量定义一样,结构体类型名+变量名即可创建一个结构体变量
struct Book book = {"CPLUS",30};
这样我们就创建了一个struct Book类型的变量book,初始化时,要赋的值用大括号括起来,之后book里的成员变量会依次被赋予这些值。
如果初始化的时候不知道要赋什么值,可以写成:
struct Book book = {0};
这样结构体里的所有成员都会被赋0值。
其实结构体也可以在创建的同时定义一个结构体变量:
struct Book
{
char name[20];
int price;
}book;
这样我们就在创建的同时定义了一个struct Book类型的book变量,并且book中的所有成员都会被初始化为0。
3.创建结构体技巧
我们知道在定义结构体变量的时候总是要加上一个struct的关键字,很繁琐,我们其实可以用一个小技巧来简化一下后续的定义结构体变量的代码。
我们在创建结构体变量的同时使用typedef来对结构体类型重定义,即把结构体类型的长长的名字缩短一点。
typedef struct Book
{
char name[20];
int price;
}Book;
在上述代码中,我们先创建了一个struct Book的结构体类型,接着我们使用typedef来对这个结构体类型进行了重定义,即改变了这个结构体类型的名字,通过这个操作,我们在后续的创建这一结构体类型的变量时,就可以省去写struct前缀的这一步。
我们可以写成:
Book book = {"CPLUS",30};
非常好用👍
三.嵌套结构体📕
我们在上面说过,一个结构体的成员可以是不同类型的变量,其中包括了整型类型,char类型,指针类型和结构体类型。一个结构体里含另一个结构体的这种情况就叫做结构体的嵌套。
struct Book
{
char name[20];
int price;
};
struct Bag
{
int num;
struct Book book;//结构体嵌套
};
★要注意,一个结构体是不可以嵌套它自己的,比如下面的代码
struct Book
{
struct Book b;
};
如果认为这样写没问题,那我们顺着这个代码推理一下,struct Book这个结构体类型的大小是多少呢?这样一直嵌套下去的话难道是无穷大吗?这显然是不合理的。所以要记住结构体不能嵌套它自己使用。
如果想实现结构体包含自己,可以尝试另一种方式,即包含其结构体类型的指针。
struct Book
{
int data;
struct Book* next;
};
这样就能实现一个类似自己嵌套自己的功能了。
四.结构体成员的访问 🌳
访问结构体成员的方式有两种:
1.结构体变量名.结构体成员名
2.结构体变量地址->结构体成员名
当我们有结构体变量时,我们可以直接使用第一种方式访问。而有时我们只有结构体指针,这时我们就可以使用->来访问。
五.结构体传参🖊
结构体传参有两种方式,一是直接传结构体变量,二是传结构体变量的地址。
我们知道调用的函数是在栈上开辟空间的,如果我们直接把结构体变量传给函数,函数还会在栈区上临时拷贝一份该结构体变量,如果这份结构体变量过大,那很有可能会导致栈溢出的这种情况(毕竟栈区的空间也不是很大),所以,我们在结构体传参的时候最好是传一个结构体的地址过去,毕竟通过结构体指针,我们也可以使用->操作符来对结构体变量的成员进行一系列访问操作。
🥁总结
1.创建一个结构体类型时可以使用typedef操作来简化后面的定义结构体变量的流程。
2.访问结构体变量的成员有两种方式,一是结构体变量名.成员名,二是结构体指针->成员名。
3.结构体传参时最好传结构体变量的指针。