CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
C 语言入门/课时/结构体与联合体
RawBlame
课时目录12 节

C 语言入门

  1. 01C 是什么
  2. 02类型与变量
  3. 03控制流与运算符
  4. 04函数
  5. 05指针与内存
  6. 06数组与字符串
  7. 07结构体与联合体
  8. 08预处理器
  9. 09编译与构建
  10. 10并发与进程
  11. 11调试与测试
  12. 12综合练习

结构体与联合体

struct/union、链表直觉。

30 分钟

结构体与联合体

struct 将相关数据聚合,union 共享同一块内存。对照 /roadmaps/c,本课是链表、协议解析与内核数据结构的入门。

学习目标

  • 定义与使用结构体
  • 理解内存对齐与 sizeof(struct)
  • 用结构体实现简单链表节点
  • 了解 union 的典型用途

核心概念

结构体与链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
    int id;
    char name[32];
    struct Node *next;
} Node;

static Node *node_create(int id, const char *name) {
    Node *n = malloc(sizeof(Node));
    if (!n) return NULL;
    n->id = id;
    strncpy(n->name, name, sizeof n->name - 1);
    n->name[sizeof n->name - 1] = '\0';
    n->next = NULL;
    return n;
}

static void list_push_front(Node **head, Node *n) {
    n->next = *head;
    *head = n;
}

static void list_free(Node *head) {
    while (head) {
        Node *tmp = head;
        head = head->next;
        free(tmp);
    }
}

int main(void) {
    Node *head = NULL;
    list_push_front(&head, node_create(1, "intro"));
    list_push_front(&head, node_create(2, "types"));

    for (Node *p = head; p; p = p->next) {
        printf("[%d] %s\n", p->id, p->name);
    }

    typedef union {
        int i;
        float f;
        char bytes[4];
    } Value;

    Value v;
    v.i = 0x41424344;
    printf("union as int=%d bytes=%c%c%c%c\n",
           v.i, v.bytes[0], v.bytes[1], v.bytes[2], v.bytes[3]);

    list_free(head);
    printf("Node size=%zu\n", sizeof(Node));
    return 0;
}

设计要点

概念说明
自引用结构体可含指向自身类型的指针
对齐编译器插入 padding,sizeof 可能大于字段之和
typedef常配合 struct 简化类型名
union同一时刻只应有一种成员有效

C 无类:无构造/析构函数,初始化靠字面量 {0} 或 calloc。

与 C++/Java 对照

特性C structC++ classJava class
方法无(函数分离)有有
访问控制无 public/private有有
继承
无
有
有
内存布局可预测可预测JVM 管理
链表手动指针智能指针/listLinkedList

Java 的 POJO 类似 C struct + 方法;C++ 的 class 默认成员私有,struct 默认公有。

练习

  • 定义 Point { double x, y; } 并写函数计算两点距离
  • 扩展链表:实现 find_by_id 与 list_size
  • 用 union 存储「要么是 int 要么是 float」并打印
  • 打印空 struct 与含 char+int 的 struct 的 sizeof,观察对齐

小结

struct 聚合数据,指针串联结构;union 省内存但需纪律。 下一课学习预处理器。

加载本节练习…
← 上一课数组与字符串下一课 →预处理器