一、定义和使用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;
};