文章目录
一、结构体类型的声明和自引用
前⾯我们在学习操作符的时候,已经学习了结构体的基本知识,这⾥稍微复习⼀下结构体类型的声明,然后学习一些新的东西
1.结构体类型的普通声明
我们来看看结构体声明时的格式:
struct tag
{
member-list;
}variable-list;
其中,tag就是这个结构体的名称,member-list就是成员列表,包含了对结构体进行描述的变量,variable-list是创建结构体时需要同时创建的结构体变量
比如我们举一个例子,我们想要描述一个学生,不能用单个的变量就对学生描述完整,所以我们就要使用结构体,在结构体中,我们可以包含学生的姓名、年龄、性别、学号等等多种信息,完整的描述一个学生
这里我们就举一个简单的例子,在创建学生这个结构体时,同时创建一个结构体变量,如下:
struct stu
{
char name[20];
int age;
char sex[5];
char id[20];
}s1;
2.结构体的特殊声明
在声明结构的时候,可以不完全的声明,可以不写结构体的名字,但是只能用一次,这就是结构体的特殊声明,也叫匿名结构体
这种情况下,只能在创建结构体时创建好一次性的结构体变量,也就是只能创建全局变量,不能在main函数中创建局部变量,这里我们来创建一个试试:
struct
{
char name[20];
int age;
char sex[5];
char id[20];
}x;
在上面的结构体中,结构体变量x就只能使用一次
3.结构体的自引用
在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?
比如,定义一个链表节点:
struct Node
{
int data;
struct Node next;
};
这个代码中,data是节点的数据,而struct Node next就包含了下一个节点
那么上述代码正确吗?如果正确,那么这个结构体的大小是多上?也就是sizeof(struct Node) 是多少?
仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的大小就会无穷的大,是不合理的
正确的自引用方式是把下一个节点的地址存储起来,一个地址的大小是确定的,不是4个字节就是8个字节,不会存在结构体无限大的情况,如下:
struct Node
{
int data;
struct Node* next;
};
二、结构体变量的创建和初始化
1.结构体变量的创建
刚刚我们讲到了结构体类型的声明,那么创建好一个结构体后,我们怎么创建一个结构体变量呢?
(1)方法就是在创建结构体时,直接在variable-list中创建
(2)我们首先要知道结构体变量的类型是什么,就是struct再加上结构体的名字,然后我们将其当作一个类型使用来创建变量即可
比如我们刚刚在创建结构体时创建了一个结构体变量s1,现在我们不通过这种方式创建结构体变量,我们就采用普通方式该怎么做呢?如下:
int main()
{
struct stu s1;
return 0;
}
这里我们就是把struct stu当作结构体变量的类型来创建变量,那么这种方式创建结构体变量,和在声明结构体时创建变量有什么不同呢?
我们可以根据它们的位置来看,一个创建在main函数外,所以创建出来的结构体变量是全局变量,一个创建在main函数外,所以创建出来的结构体变量是局部变量
2.结构体变量的初始化
(1)按结构体成员的顺序初始化
当我们在按照顺序来初始化结构变量时,可以直接使用一个大括号,按照顺序给对应的成员赋值,比如现在我们要初始化s1
s1包含的信息有,姓名:zhangsan,年龄:18,性别:男,学号:24101100514,我们来初始化试试:
//注意字符串该有的双引号不要忘记
struct stu s1