【C语言】自定义类型:结构体

在这里插入图片描述

一、结构体类型的声明和自引用

   前⾯我们在学习操作符的时候,已经学习了结构体的基本知识,这⾥稍微复习⼀下结构体类型的声明,然后学习一些新的东西

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 
评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值