结构体是C语言中一种允许将多个不同类型的数据项组合成一个单一的复合类型的数据结构。通过结构体,可以更加方便地管理和组织复杂的数据。
1. 结构体的定义
结构体通过关键字 struct
定义。结构体定义不会占用内存空间,它只是定义了一个模板。
struct Person {char name[50];int age;float salary;
};
在这里,Person
是结构体的名称,它包含了三个不同类型的成员:字符数组 name
,整数 age
和浮点数 salary
。
结构体通过struct
关键字来定义,其基本语法如下:
struct structure_name {type member1;type member2;...type memberN;
};
这里,structure_name
是结构体的名称,member1
、member2
、…、memberN
是结构体的成员,可以是不同的数据类型。
示例
定义一个表示学生信息的结构体:
struct Student {char name[50];int age;float score;
};
2. 结构体变量的声明和初始化
结构体定义完成后,可以使用结构体类型声明结构体变量。结构体变量可以在声明时初始化。
声明结构体变量
结构体定义之后,可以声明结构体变量。结构体变量实际上是结构体类型的一个实例。
struct Person person1, person2;
初始化结构体变量
struct Student stu1 = {"Alice", 20, 92.5};
也可以分别为每个成员赋值:
struct Student stu1;
strcpy(stu1.name, "Bob");
stu1.age = 21;
stu1.score = 88.5;
3. 访问结构体成员
可以使用点运算符 .
来访问结构体的成员。
strcpy(person1.name, "Alice");
person1.age = 30;
person1.salary = 45000.50;
4. 结构体指针
结构体指针用于存储结构体变量的地址。通过结构体指针,可以访问结构体的成员。
声明结构体指针
struct Student *ptr;
将结构体变量的地址赋给指针
ptr = &stu1;
通过结构体指针访问成员
使用->
操作符通过结构体指针访问结构体的成员:
printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("Score: %.2f\n", ptr->score);
5. 结构体数组
结构体数组是存储结构体类型元素的数组。它允许存储多个相同类型的结构体变量。
声明和初始化结构体数组
struct Student students[3] = {{"Alice", 20, 92.5},{"Bob", 21, 88.5},{"Charlie", 22, 95.0}
};
访问结构体数组的成员
for (int i = 0; i < 3; i++) {printf("Student %d: Name: %s, Age: %d, Score: %.2f\n", i+1, students[i].name, students[i].age, students[i].score);
}
6. 结构体和函数
结构体可以作为函数的参数传递,也可以作为函数的返回值。传递结构体给函数可以通过值传递和引用传递(通过指针)两种方式。
通过值传递结构体
void printStudent(struct Student stu) {printf("Name: %s, Age: %d, Score: %.2f\n", stu.name, stu.age, stu.score);
}
通过指针传递结构体
void modifyStudent(struct Student *stu) {stu->age += 1; // 假设生日过后,年龄加1
}
6. 匿名结构体
可以创建没有名称的匿名结构体。
struct {char name[50];int age;
} person3;
7. 嵌套结构体
结构体可以包含另一个结构体作为其成员。
struct Date {int day;int month;int year;
};struct Employee {char name[50];struct Date birthday;
};
9. 动态结构体数组
可以动态分配结构体数组。
struct Person *ptr;
int n = 5;
ptr = (struct Person*) malloc(n * sizeof(struct Person));
10. 结构体与文件操作
结构体可以用于文件读写操作。
fwrite(&person1, sizeof(struct Person), 1, filePtr);
fread(&person2, sizeof(struct Person), 1, filePtr);
11. typedef
与结构体
使用 typedef
为结构体类型创建新名字。
typedef struct Person {char name[50];int age;float salary;
} Person;Person person1, person2;
这里,Person
现在成为结构体 struct Person
的别名。
12. 共用体与结构体
结构体内可以包含共用体(Union),这允许在同一内存位置存储不同的数据类型。
struct Data {union {int i;float f;char str[20];} data;
};
结构体是一种非常强大的特性,允许以有组织的方式处理相关数据项集合。