struct结构体的用法

在C语言中,struct 是一种用于定义复合数据类型的关键字。它允许将多个不同类型的变量组合在一起,形成一个新的数据类型。


1. 基本语法

定义一个结构体的基本语法如下:

struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
    // 更多成员...
};
  • 结构体名:结构体的名称,用于声明变量。

  • 成员:结构体内部的变量,可以是任意数据类型(如 intfloatchar,甚至是其他结构体)。


2. 定义结构体

以下是一个简单的例子,定义一个表示点的结构体:

struct Point {
    int x;
    int y;
};
  • 这里定义了一个名为 Point 的结构体,包含两个成员:x 和 y,分别表示点的横坐标和纵坐标。


3. 声明结构体变量

定义结构体后,可以声明结构体变量:

struct Point p1; // 声明一个 Point 类型的变量 p1
  • 这里 p1 是一个 Point 类型的变量,可以通过 p1.x 和 p1.y 访问其成员。


4. 初始化结构体

可以在声明时直接初始化结构体变量:

struct Point p2 = {10, 20}; // 初始化 p2,x=10,y=20
  • 初始化时,成员的顺序必须与结构体定义中的顺序一致。


5. 访问结构体成员

使用点运算符 . 访问结构体的成员:

p1.x = 5;
p1.y = 15;
printf("Point p1: (%d, %d)\n", p1.x, p1.y);

6. 结构体指针

可以定义指向结构体的指针,并通过箭头运算符 -> 访问成员:

struct Point* ptr = &p1; // ptr 是指向 p1 的指针
ptr->x = 100;            // 修改 p1 的 x 值
printf("Point p1: (%d, %d)\n", ptr->x, ptr->y);

7. typedef 简化结构体类型名

使用 typedef 可以为结构体定义一个别名,简化代码:

typedef struct Point {
    int x;
    int y;
} Point; // 现在可以直接用 Point 代替 struct Point

Point p3 = {30, 40}; // 直接使用 Point 声明变量

8. 结构体嵌套

结构体可以嵌套其他结构体:

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);

9. 结构体数组

可以定义结构体数组,用于存储多个结构体变量:

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);
}

10. 结构体作为函数参数

结构体可以作为函数的参数或返回值:

// 函数:计算两点之间的距离
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));

11. 动态分配结构体

可以使用 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); // 释放内存

12. 结构体的大小

使用 sizeof 可以获取结构体的大小:

printf("Size of Point: %lu bytes\n", sizeof(Point));
  • 注意:结构体的大小可能会因为内存对齐(alignment)而大于成员大小的总和。


13. 结构体的内存对齐

结构体的成员在内存中可能会对齐到特定的边界,以提高访问效率。可以使用 #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));

14. 匿名结构体

C11 标准支持匿名结构体,可以直接定义结构体变量:

struct {
    int x;
    int y;
} point = {10, 20}; // 直接定义变量 point

15. 结构体的常见用途

  • 链表节点

    typedef struct Node {
        int data;
        struct Node* next;
    } Node;
  • 二叉树节点

    typedef struct TreeNode {
        int data;
        struct TreeNode* left;
        struct TreeNode* right;
    } TreeNode;
  • 复杂数据结构:如图、堆、栈等。


总结

struct 是C语言中用于定义复合数据类型的关键字,常用于组织和管理复杂数据。通过结构体,可以将多个相关的数据组合在一起,提高代码的可读性和可维护性。掌握结构体的定义、初始化、访问、指针操作等技巧,是C语言编程的基础。

你可能感兴趣的:(数据结构,c++,c语言)