C语言结构体学习笔记

C语言结构体学习笔记


目录

  • 结构体基本概念
  • 结构体变量定义
  • 结构体初始化
  • 结构体数组
  • 结构体指针
  • 共用体
  • 枚举类型
  • typedef自定义类型
  • 总结

结构体基本概念

1. 什么是结构体?

  • 结构体:一种用户自定义的数据类型,用于将多个不同类型的变量组合成一个整体。
  • 用途:表示复杂数据(如学生信息:学号、姓名、成绩等)。

2. 结构体定义

struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
    // 可以嵌套结构体
    struct 子结构体名 子成员;
};
示例
struct Student {
    int num;        // 学号
    char name[20];  // 姓名
    float score;    // 成绩
};

结构体变量定义

3种定义方式:

  1. 先声明类型,后定义变量

    struct Student stu1, stu2;
    
  2. 声明类型时直接定义变量

    struct Student {
        int num;
        char name[20];
    } stu1, stu2;
    
  3. 匿名结构体(无法重复使用)

    struct {
        int num;
        char name[20];
    } stu1, stu2;
    

结构体初始化

1. 普通初始化

struct Student stu1 = {101, "张三", 90.5};

2. 嵌套结构体初始化

struct Date {
    int year;
    int month;
};

struct Student {
    int num;
    struct Date birthday; // 嵌套结构体
};

struct Student stu2 = {102, {2000, 9}};

3. 数组成员初始化

struct Score {
    float math;
    float english;
};

struct Student stu3 = {103, {85.5, 92.0}};

结构体数组

定义与初始化

struct Student stu_arr[3] = {
    {101, "张三", 90.5},
    {102, "李四", 88.0},
    {103, "王五", 95.5}
};

访问数组成员

printf("姓名:%s,成绩:%.1f\n", stu_arr[0].name, stu_arr[0].score);

结构体指针

1. 定义结构体指针

struct Student stu = {101, "张三", 90.5};
struct Student *p = &stu;

2. 通过指针访问成员

printf("学号:%d\n", (*p).num);  // 方式1
printf("姓名:%s\n", p->name);   // 方式2(更常用)

3. 结构体指针作为函数参数

void print_student(struct Student *p) {
    printf("学号:%d,姓名:%s\n", p->num, p->name);
}

共用体(Union)

特点

  • 所有成员共享同一块内存,同一时间只能存储一个成员的值。
  • 内存大小由最大的成员决定。

定义与使用

union Data {
    int num;
    char ch;
    float f;
};

union Data data;
data.num = 10;     // 存入整数
data.ch = 'A';     // 存入字符(覆盖之前的数值)

枚举类型

定义与使用

enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

enum Week today = Mon;
if (today == Mon) {
    printf("今天是周一\n");
}

显式赋值

enum Color {Red=1, Green=2, Blue=4};

typedef自定义类型

简化类型名

typedef struct Student {
    int num;
    char name[20];
} Stu;

Stu stu1 = {101, "张三"};

总结

核心知识点

  1. 结构体:组合不同数据类型的工具。
  2. 定义与初始化:支持嵌套和数组。
  3. 指针操作:通过->访问成员。
  4. 共用体:共享内存,节省空间。
  5. 枚举类型:定义常量集合。
  6. typedef:简化复杂类型名。

常见问题

  • 字节对齐:结构体大小可能因对齐规则而变大。
  • 赋值规则:结构体变量可直接赋值,但不能整体输入输出。

练习题:定义一个包含学生姓名、3门成绩的结构体,计算平均分并输出。

你可能感兴趣的:(c语言,c语言,学习,笔记)