前言
在C语言当中,除了我们常用的几个基本的数据类型之外,还有一种类型叫自定义类型。比如:我们要描述一个学生。这个学生有姓名,性别,年龄,身高等。单独用基本的数据类型是不能完全描述的。这个时候就要使用我们自定义的类型来进行描述。自定义的类型有结构体,枚举和联合体。
本文导航
一. 结构体
1.1 结构体概述
结构体概念
C语言 数组允许定义可存储相同类型数据项的变量,结构是C语言编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。
结构体是一些值的集合,这些值被称为成员变量,每一个成员变量可以有不同的类型。
结构体的声明与使用
结构体的声明与定义
//结构体
struct Stu //这里的Stu表示标签,不是变量名
{
char name[20];//姓名
char sex[5];//性别
char id[20];//学号
int age;//年龄
double grade;//成绩
}student; //变量列表,用来定义变量。注意这里的分号
其中struct Stu
是自定义结构体类型,花括号内的一系列数据类型称为结构体成员变量,student
为定义的结构体类型变量。
结构体的不完全声明
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
int main()
{
p = &x; //err
}
上面的两个结构体声明时省略了结构体标签,但是只能跟在结构体声明后创建结构体变量,其他情况下是无法创建该结构体变量的,这也就说明后续无法创建该结构体指针;就算再声明一个成员变量相同的的结构体的指针p,将x的地址赋值给p,编译器会发生报错,因为编译器会将他们当做两个不同类型的结构体处理。
结构体的自引用
struct Node
{
int data;
struct Node next;
};
直接将结构体嵌套在相同结构体是不可取的,你可以想象一下,如果可以这么做,那这个结构体的大小是多少,他会无限制地嵌套下去,导致栈溢出,如果硬是需要嵌套自身,应该嵌套相同结构体类型的指针。(数据结构的链表)
struct Node
{
int data;
struct Node* next;
};
在使用typedef定义结构体自引用时,不能直接在结构体中使用typedef替换的结构体类型名直接定义结构体指针,而是应该使用原类型名定义在结构体中定义结构体指针.
//错误示例:
typedef struct NODE
{
int data;
Node* next;
}Node;
//正确示例:
typedef struct NODE
{
int data;
struct NODE* next;
}Node;
结构体的使用与传参
#include <stdio.h>
struct Stu
{
char name[20];//姓名
char sex[5];//性别
char id[20];//学号
int age;//年龄
double grade;//成绩
}student;
int main()
{
struct Stu s = {
"张三","男","20220711",20,90 };//结构体声明与初始化
//结构体成员访问方式1:结构体变量名.结构体成员名
printf("姓名:%s\n", s.name);
printf("性别:%s\n", s.sex);
struct Stu* ps = &s;
//结构体访问成员方式2:结构体指针->结构体成员名
printf