优秀的编程知识分享平台

网站首页 > 技术文章 正文

结构体(Struct)

nanyue 2025-03-12 18:55:25 技术文章 2 ℃

结构体是C语言中一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个逻辑上的整体。结构体非常适合用来表示复杂的数据结构,例如学生信息、员工记录、几何图形等。


1.结构体的定义

结构体的定义使用 struct 关键字,语法如下:

struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员N;
};

示例:定义一个表示学生信息的结构体

struct Student {
    int id;          // 学号
    char name[50];   // 姓名
    float score;     // 成绩
};

2.结构体变量的声明

定义结构体后,可以声明结构体变量。声明方式有两种:

(1)直接声明

struct Student {
    int id;
    char name[50];
    float score;
} student1, student2;  // 直接声明两个结构体变量

(2)先定义结构体,再声明变量

struct Student {
    int id;
    char name[50];
    float score;
};

struct Student student1, student2;  // 声明结构体变量

3.结构体成员的访问

结构体成员通过点运算符(.)访问。

示例

#include 

struct Student {
    int id;
    char name[50];
    float score;
};

int main() {
    struct Student student1;

    // 赋值
    student1.id = 1;
    strcpy(student1.name, "Alice");
    student1.score = 95.5;

    // 访问
    printf("学号: %d\n", student1.id);
    printf("姓名: %s\n", student1.name);
    printf("成绩: %.2f\n", student1.score);

    return 0;
}

输出

学号: 1
姓名: Alice
成绩: 95.50

4.结构体数组

结构体数组用于存储多个结构体变量。

示例

#include 

struct Student {
    int id;
    char name[50];
    float score;
};

int main() {
    struct Student students[3];  // 定义结构体数组

    // 赋值
    for (int i = 0; i < 3; i++) {
        printf("输入第 %d 个学生的信息:\n", i + 1);
        printf("学号: ");
        scanf("%d", &students[i].id);
        printf("姓名: ");
        scanf("%s", students[i].name);
        printf("成绩: ");
        scanf("%f", &students[i].score);
    }

    // 输出
    printf("\n学生信息:\n");
    for (int i = 0; i < 3; i++) {
        printf("学号: %d, 姓名: %s, 成绩: %.2f\n", 
               students[i].id, students[i].name, students[i].score);
    }

    return 0;
}

5.结构体指针

结构体指针用于动态操作结构体变量。

示例

#include 
#include 

struct Student {
    int id;
    char name[50];
    float score;
};

int main() {
    struct Student *studentPtr;

    // 动态分配内存
    studentPtr = (struct Student *)malloc(sizeof(struct Student));

    // 赋值
    studentPtr->id = 1;
    strcpy(studentPtr->name, "Bob");
    studentPtr->score = 88.5;

    // 访问
    printf("学号: %d\n", studentPtr->id);
    printf("姓名: %s\n", studentPtr->name);
    printf("成绩: %.2f\n", studentPtr->score);

    // 释放内存
    free(studentPtr);

    return 0;
}

注意

  • 使用 -> 运算符访问结构体指针的成员。
  • 动态分配内存后,记得使用 free 释放内存。

6.结构体嵌套

结构体可以嵌套其他结构体,用于表示更复杂的数据结构。

示例

#include 

struct Date {
    int year;
    int month;
    int day;
};

struct Student {
    int id;
    char name[50];
    struct Date birthday;  // 嵌套结构体
};

int main() {
    struct Student student1;

    // 赋值
    student1.id = 1;
    strcpy(student1.name, "Charlie");
    student1.birthday.year = 2000;
    student1.birthday.month = 10;
    student1.birthday.day = 15;

    // 访问
    printf("学号: %d\n", student1.id);
    printf("姓名: %s\n", student1.name);
    printf("生日: %d-%02d-%02d\n", 
           student1.birthday.year, 
           student1.birthday.month, 
           student1.birthday.day);

    return 0;
}

7.结构体与函数

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

示例

#include 

struct Point {
    int x;
    int y;
};

// 函数:打印点的坐标
void printPoint(struct Point p) {
    printf("(%d, %d)\n", p.x, p.y);
}

// 函数:返回一个点
struct Point createPoint(int x, int y) {
    struct Point p;
    p.x = x;
    p.y = y;
    return p;
}

int main() {
    struct Point p1 = createPoint(3, 4);
    printPoint(p1);  // 输出: (3, 4)

    return 0;
}

8.结构体的对齐与大小

结构体的大小受内存对齐规则影响。可以使用 sizeof 运算符查看结构体的大小。

示例

#include 

struct Example {
    char a;
    int b;
    double c;
};

int main() {
    printf("结构体大小: %lu 字节\n", sizeof(struct Example));
    return 0;
}

输出

结构体大小: 16 字节

总结

结构体是C语言中非常重要的数据类型,用于将不同类型的数据组合在一起。通过结构体,可以更清晰地表示复杂的数据结构,并提高代码的可读性和可维护性。掌握结构体的定义、访问、嵌套、指针操作以及与函数的结合使用,是C语言编程的基础之一。

最近发表
标签列表