C语言中的 Struct

发布时间:2023-05-22

一、定义和使用Struct

Struct是C语言中构建复杂数据类型的基础。它可以包含多个不同的变量,并且可以用一个变量名引用它们。定义一个struct需要先定义它的类型名,再定义结构体的变量。

/* 定义struct类型 */
struct Person {
    char name[20];
    int age;
    int id;
};
/* 定义struct变量 */
struct Person someone;

在定义一个struct变量时,可以直接为其中的变量赋初值。

/* 直接为变量赋初值 */
struct Person someone = {"Tom", 20, 123456};

访问struct变量的成员可以使用“.”运算符。

/* 访问某一成员 */
printf("Name: %s\n", someone.name);

二、Struct和指针

使用struct指针可以更方便地访问和修改struct的成员。在定义struct类型时,加上“*”可以定义一个指向该类型的指针。

/* 定义指向Person类型的指针 */
struct Person *ptr;

访问struct变量的成员可以使用“->”运算符。

/* 使用指针访问变量 */
ptr = &someone;
printf("Age: %d\n", ptr->age);

同时,使用指针可以更方便地传递struct类型的参数。

/* 传递指针作为参数 */
void display(struct Person *p) {
    printf("ID: %d\n", p->id);
}
display(&someone);

三、Struct和数组

数组可以存储多个相同类型的数据,struct也可以存储多个相同类型的数据。使用数组和struct可以构建更复杂的数据结构。

/* 定义存储多个Person类型的数组 */
struct Person group[3];
/* 初始化数组 */
group[0] = {"Tom", 20, 123456};
group[1] = {"John", 21, 234567};
group[2] = {"Mary", 22, 345678};
/* 输出数组中第二个元素的名字 */
printf("Name: %s", group[1].name);

可以使用指针遍历数组中的元素,并访问其成员。

/* 使用指针遍历数组并输出其成员 */
for(int i=0; i<3; i++) {
    printf("Name: %s\n", (group+i)->name);
}

四、Struct和文件读写

Struct可以使用文件进行读写操作,以此实现文件的持久化存储。

/* 打开文件 */
FILE *fp;
fp = fopen("test.txt", "w");
/* 定义并写入struct */
struct Person someone = {"Tom", 20, 123456};
fwrite(&someone, sizeof(struct Person), 1, fp);
/* 关闭文件 */
fclose(fp);

可以使用fread函数从文件中读取struct数据。

/* 打开文件 */
fp = fopen("test.txt", "r");
/* 读取文件并输出内容 */
struct Person temp;
fread(&temp, sizeof(struct Person), 1, fp);
printf("Name: %s\nAge: %d\nID: %d\n", temp.name, temp.age, temp.id);
/* 关闭文件 */
fclose(fp);

五、Struct的高级应用

Struct还有很多高级应用,例如在struct中嵌套其他struct、使用typedef定义新类型、使用联合体构建新类型等等。

/* 嵌套struct */
struct Date {
    int year;
    int month;
    int day;
};
struct Student {
    char name[20];
    struct Date birth;
};
/* 使用typedef定义新类型 */
typedef struct {
    char name[20];
    int age;
} Person;
/* 使用联合体构建新类型 */
union Data {
    int count;
    float weight;
};
struct Item {
    int type;
    union Data info;
};