结构体的简单介绍C语言
目录
结构体的简单介绍(C语言)
本文起到数据结构学习前的C语言知识复习补充作用
结构体:
1. 结构体的定义与作用
核心概念
:结构体(
struct
)是C语言中一种
自定义数据类型
,用于将多个不同类型的变量组合成一个整体。
解决的问题 :当需要同时管理一组逻辑相关但类型不同的数据时(如学生信息、商品属性),结构体可以简化数据管理。
示例场景 :
示例一:存储一个学生的信息:姓名(字符串)、年龄(整数)、成绩(浮点数);
示例二:存储一个二维平面的点 例如a:( x , y )。
2. 结构体的声明
语法 :
//对应示例一:
struct 结构体名
{
数据类型 成员1;
数据类型 成员2;
// ...
};
//对应示例二:
struct (结构体名)Point
{
数值类型 x; // 横坐标
数值类型 y; // 纵坐标
}
代码示例 :
//对应示例一:
// 声明一个结构体类型 Student
struct Student
{
char name[20];
int age;
float score;
};
//对应示例二:
struct Point
{
float x; // x坐标
float y; // y坐标
};
3. 结构体变量的定义与初始化
(1) 直接定义变量
struct Student
{
char name[20];
int age;
} stu1, stu2; // 直接定义两个结构体变量 stu1 和 stu2
(2) 先声明类型,再定义变量
struct Student stu3; // 通过类型名定义变量
(3) 初始化赋值
struct Student stu4 = {"张三", 18, 90.5}; // 按顺序初始化成员
关于结构体括号后是否加名字的问题( typedef
)
1. 未使用 typedef
的结构体
代码示例
// 定义结构体类型
struct Point
{
double x;
double y;
};
// 声明结构体变量时必须带"struct"关键字
struct Point a = {3.0, 4.0};
缺点
- 每次声明变量时都需要写
struct Point
,冗余且繁琐。
2. 使用 typedef
后的结构体
代码示例
// 通过typedef为结构体定义别名"Point"
typedef struct
{
double x;
double y;
} Point;
// 声明变量时直接使用别名
Point a = {3.0, 4.0};
优点
- 简化变量声明,省略
struct
关键字。 - 提升代码可读性,更接近自然语言(如
Point
直接表示点的类型)。
3. typedef
的两种常见写法
写法1:匿名结构体 + typedef
typedef struct
{
// 结构体本身没有名字(匿名)
double x;
double y;
} Point;
// 别名是Point
写法2:有名字的结构体 + typedef
typedef struct _Point
{
// 结构体本身有名字"_Point"
double x;
double y;
} Point;
// 别名是Point
两种写法的区别
- 匿名结构体 :适用于不需要在结构体内部引用自身的情况(如普通坐标点)。
- 有名字的结构体 :适用于需要 自引用 的场景(如链表节点)。
4. 自引用场景示例(链表节点)
必须使用有名字的结构体
typedef struct Node
{
// 结构体名为Node
int data;
struct Node* next;
// 内部需要引用自身类型
} Node;
// 别名为Node
// 使用示例
Node head;
head.data = 1;
head.next = NULL;
错误写法(匿名结构体)
typedef struct
{ // 匿名结构体
int data;
struct Node* next; // 错误!此时"Node"还未定义
} Node;
5. 伪代码对比
未用 typedef
定义结构体 Point {
x: 数值类型
y: 数值类型
}
声明变量: struct Point a = {x:3, y:4}
使用 typedef
后
定义类型 Point 为结构体 {
x: 数值类型
y: 数值类型
}
声明变量: Point a = {x:3, y:4}
6. 总结
typedef
的作用 :为复杂类型(如结构体)定义简洁的别名。- 适用场景
:
- 简化代码,减少
struct
重复书写。 - 定义自引用结构体(如链表、树节点)。
- 提高代码可移植性(例如统一修改类型名称)。
- 简化代码,减少
- 注意事项 :自引用时必须使用有名字的结构体定义。