C 语言结构体基础
外观
C语言结构体基础[编辑 | 编辑源代码]
简介[编辑 | 编辑源代码]
结构体(struct)是C语言中一种重要的复合数据类型,它允许将多个不同类型的变量组合成一个逻辑单元。结构体为程序员提供了一种组织相关数据的有效方式,是构建复杂数据结构的基础。
在C语言中,结构体具有以下特点:
- 可以包含任意数量的成员变量(称为"字段")
- 每个成员可以有不同类型
- 成员在内存中按照声明顺序连续存储(可能有填充字节)
- 大小等于所有成员大小之和(考虑内存对齐)
基本语法[编辑 | 编辑源代码]
结构体的定义使用struct
关键字:
struct 结构体标签 {
数据类型 成员1;
数据类型 成员2;
// 更多成员...
};
例如,定义一个表示二维点的结构体:
struct Point {
int x;
int y;
};
声明和使用结构体变量[编辑 | 编辑源代码]
定义结构体后,可以声明该类型的变量:
// 方式1:先定义结构体类型,再声明变量
struct Point p1;
// 方式2:定义结构体类型的同时声明变量
struct Point {
int x;
int y;
} p2, p3;
// 方式3:使用typedef创建别名
typedef struct {
int x;
int y;
} Point;
Point p4;
访问结构体成员使用点运算符(.
):
p1.x = 10;
p1.y = 20;
printf("Point coordinates: (%d, %d)\n", p1.x, p1.y);
初始化结构体[编辑 | 编辑源代码]
结构体可以在声明时初始化:
// 按成员顺序初始化
struct Point p1 = {10, 20};
// 指定成员初始化(C99及以上)
struct Point p2 = {.x = 30, .y = 40};
// 部分初始化
struct Point p3 = {.y = 50}; // x默认为0
内存布局[编辑 | 编辑源代码]
结构体在内存中的布局可以表示为:
考虑内存对齐时,实际布局可能有填充字节。例如:
struct Example {
char c; // 1字节
int i; // 4字节(可能在c后有3字节填充)
double d; // 8字节
};
实际应用示例[编辑 | 编辑源代码]
学生信息管理系统[编辑 | 编辑源代码]
以下是一个使用结构体管理学生信息的示例:
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[50];
float gpa;
} Student;
void printStudent(Student s) {
printf("ID: %d\nName: %s\nGPA: %.2f\n", s.id, s.name, s.gpa);
}
int main() {
Student class[3];
// 初始化学生数组
class[0] = (Student){101, "Alice", 3.8};
class[1] = (Student){102, "Bob", 3.5};
strcpy(class[2].name, "Charlie");
class[2].id = 103;
class[2].gpa = 3.9;
// 打印学生信息
for(int i = 0; i < 3; i++) {
printStudent(class[i]);
printf("--------\n");
}
return 0;
}
输出:
ID: 101 Name: Alice GPA: 3.80 -------- ID: 102 Name: Bob GPA: 3.50 -------- ID: 103 Name: Charlie GPA: 3.90 --------
高级主题[编辑 | 编辑源代码]
结构体嵌套[编辑 | 编辑源代码]
结构体可以包含其他结构体作为成员:
typedef struct {
int day;
int month;
int year;
} Date;
typedef struct {
char name[50];
Date birthday;
float salary;
} Employee;
结构体指针[编辑 | 编辑源代码]
可以使用指针访问结构体,此时使用->
运算符:
Employee emp = {"John", {15, 7, 1990}, 5000.0};
Employee *ptr = &emp;
printf("Name: %s\n", ptr->name);
printf("Birth year: %d\n", ptr->birthday.year);
结构体大小计算[编辑 | 编辑源代码]
结构体的大小可以使用sizeof
运算符获取,但要注意内存对齐的影响:
printf("Size of Employee: %zu bytes\n", sizeof(Employee));
常见问题[编辑 | 编辑源代码]
- 结构体与数组的区别: 数组包含相同类型的元素,而结构体可以包含不同类型的成员
- 结构体赋值: C语言允许直接结构体赋值(按值拷贝)
- 结构体作为函数参数: 可以传值(拷贝整个结构体)或传指针(更高效)
总结[编辑 | 编辑源代码]
结构体是C语言中组织相关数据的强大工具。通过将不同类型的数据组合在一起,结构体使程序更加模块化和易于维护。掌握结构体是学习更高级数据结构如链表、树等的基础。