在C语言中,struct
是一种用于定义复合数据类型的关键字。它允许将多个不同类型的变量组合在一起,形成一个新的数据类型。
定义一个结构体的基本语法如下:
struct 结构体名 { 数据类型 成员1; 数据类型 成员2; // 更多成员... };
结构体名
:结构体的名称,用于声明变量。
成员
:结构体内部的变量,可以是任意数据类型(如 int
、float
、char
,甚至是其他结构体)。
以下是一个简单的例子,定义一个表示点的结构体:
struct Point { int x; int y; };
这里定义了一个名为 Point
的结构体,包含两个成员:x
和 y
,分别表示点的横坐标和纵坐标。
定义结构体后,可以声明结构体变量:
struct Point p1; // 声明一个 Point 类型的变量 p1
这里 p1
是一个 Point
类型的变量,可以通过 p1.x
和 p1.y
访问其成员。
可以在声明时直接初始化结构体变量:
struct Point p2 = {10, 20}; // 初始化 p2,x=10,y=20
初始化时,成员的顺序必须与结构体定义中的顺序一致。
使用点运算符 .
访问结构体的成员:
p1.x = 5; p1.y = 15; printf("Point p1: (%d, %d)\n", p1.x, p1.y);
可以定义指向结构体的指针,并通过箭头运算符 ->
访问成员:
struct Point* ptr = &p1; // ptr 是指向 p1 的指针 ptr->x = 100; // 修改 p1 的 x 值 printf("Point p1: (%d, %d)\n", ptr->x, ptr->y);
使用 typedef
可以为结构体定义一个别名,简化代码:
typedef struct Point { int x; int y; } Point; // 现在可以直接用 Point 代替 struct Point Point p3 = {30, 40}; // 直接使用 Point 声明变量
结构体可以嵌套其他结构体:
typedef struct Rectangle { Point topLeft; // 左上角点 Point bottomRight; // 右下角点 } Rectangle; Rectangle rect = {{0, 10}, {20, 0}}; printf("Top-left: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y);
可以定义结构体数组,用于存储多个结构体变量:
Point points[3] = {{1, 2}, {3, 4}, {5, 6}}; for (int i = 0; i < 3; i++) { printf("Point %d: (%d, %d)\n", i, points[i].x, points[i].y); }
结构体可以作为函数的参数或返回值:
// 函数:计算两点之间的距离 double distance(Point p1, Point p2) { int dx = p1.x - p2.x; int dy = p1.y - p2.y; return sqrt(dx * dx + dy * dy); } Point a = {0, 0}; Point b = {3, 4}; printf("Distance: %f\n", distance(a, b));
可以使用 malloc
动态分配结构体内存:
Point* p = (Point*)malloc(sizeof(Point)); if (p == NULL) { printf("Memory allocation failed\n"); return 1; } p->x = 10; p->y = 20; printf("Dynamic Point: (%d, %d)\n", p->x, p->y); free(p); // 释放内存
使用 sizeof
可以获取结构体的大小:
printf("Size of Point: %lu bytes\n", sizeof(Point));
注意:结构体的大小可能会因为内存对齐(alignment)而大于成员大小的总和。
结构体的成员在内存中可能会对齐到特定的边界,以提高访问效率。可以使用 #pragma pack
修改对齐方式:
#pragma pack(push, 1) // 设置对齐为 1 字节 struct PackedPoint { int x; char y; }; #pragma pack(pop) // 恢复默认对齐 printf("Size of PackedPoint: %lu bytes\n", sizeof(struct PackedPoint));
C11 标准支持匿名结构体,可以直接定义结构体变量:
struct { int x; int y; } point = {10, 20}; // 直接定义变量 point
链表节点:
typedef struct Node { int data; struct Node* next; } Node;
二叉树节点:
typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode;
复杂数据结构:如图、堆、栈等。
struct
是C语言中用于定义复合数据类型的关键字,常用于组织和管理复杂数据。通过结构体,可以将多个相关的数据组合在一起,提高代码的可读性和可维护性。掌握结构体的定义、初始化、访问、指针操作等技巧,是C语言编程的基础。