介绍
在C语言中,结构体(struct)是一种用户定义的数据类型,它允许我们将差别类型的数据组合在一起。结构体对于处理干系联的数据非常有效,好比将一个人的姓名、年龄和地址组合在一起。
根本用法
1.定义结构体
定义结构体的语法如下:
- struct 结构体名 {
- 数据类型 成员名1;
- 数据类型 成员名2;
- ...
- 数据类型 成员名N;
- };
复制代码 比方,我们可以定义一个表示人的结构体:
- #include <stdio.h>
- // 定义结构体
- struct Person {
- char name[50];
- int age;
- char address[100];
- };
复制代码 2. 声明结构体变量
在定义告终构体之后,我们可以声明结构体变量:
- // 声明结构体变量
- struct Person person1;
复制代码 我们也可以在定义结构体时同时声明结构体变量:
- struct Person {
- char name[50];
- int age;
- char address[100];
- } person1, person2;
复制代码 3. 初始化和访问结构体成员
我们可以利用点运算符(.)来访问和赋值结构体的成员:
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- char address[100];
- };
- int main() {
- // 声明并初始化结构体变量
- struct Person person1 = {"Alice", 30, "123 Main St"};
-
- // 访问结构体成员
- printf("Name: %s\n", person1.name);
- printf("Age: %d\n", person1.age);
- printf("Address: %s\n", person1.address);
-
- // 修改结构体成员
- person1.age = 31;
- printf("Updated Age: %d\n", person1.age);
-
- return 0;
- }
复制代码 输出结果:
4. 利用指针访问结构体成员
我们还可以通过指针访问结构体成员,利用箭头运算符(->):
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- char address[100];
- };
- int main() {
- struct Person person1 = {"Bob", 25, "456 Elm St"};
- struct Person *ptr_person = &person1;
-
- // 使用指针访问结构体成员
- printf("Name: %s\n", ptr_person->name);
- printf("Age: %d\n", ptr_person->age);
- printf("Address: %s\n", ptr_person->address);
-
- // 通过指针修改结构体成员
- ptr_person->age = 26;
- printf("Updated Age: %d\n", ptr_person->age);
-
- return 0;
- }
复制代码 输出结果:
5. 利用结构体数组
偶然候我们需要处理多个相同类型的结构体变量,这时可以利用结构体数组:
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- char address[100];
- };
- int main() {
- // 定义结构体数组
- struct Person people[2] = {
- {"Charlie", 22, "789 Maple St"},
- {"Dana", 28, "101 Oak St"}
- };
-
- for (int i = 0; i < 2; i++) {
- printf("Person %d:\n", i + 1);
- printf(" Name: %s\n", people[i].name);
- printf(" Age: %d\n", people[i].age);
- printf(" Address: %s\n", people[i].address);
- }
-
- return 0;
- }
复制代码 输出结果:
高级用法
6. 嵌套结构体
结构体可以包含其他结构体作为它的成员,这称为嵌套结构体。嵌套结构体可以帮助我们创建更加复杂的数据结构。
- #include <stdio.h>
- struct Address {
- char street[100];
- char city[50];
- char state[20];
- int zip;
- };
- struct Person {
- char name[50];
- int age;
- struct Address address; // 嵌套结构体
- };
- int main() {
- struct Person person1 = {"Emily", 35, {"123 Oak St", "Springfield", "IL", 62704}};
-
- printf("Name: %s\n", person1.name);
- printf("Age: %d\n", person1.age);
- printf("Address: %s, %s, %s, %d\n",
- person1.address.street,
- person1.address.city,
- person1.address.state,
- person1.address.zip);
-
- return 0;
- }
复制代码 输出结果:
7. 匿名结构体
在某些情况下,我们可以利用匿名结构体来简化代码。匿名结构体没有名字,可以直接利用。
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- struct {
- char street[100];
- char city[50];
- char state[20];
- int zip;
- } address; // 匿名结构体
- };
- int main() {
- struct Person person1 = {"Frank", 40, {"456 Pine St", "Riverdale", "NY", 10567}};
-
- printf("Name: %s\n", person1.name);
- printf("Age: %d\n", person1.age);
- printf("Address: %s, %s, %s, %d\n",
- person1.address.street,
- person1.address.city,
- person1.address.state,
- person1.address.zip);
-
- return 0;
- }
复制代码 输出结果:
8. 结构体和动态内存分配
在处理大型数据集或需要动态创建结构体时,可以利用动态内存分配(如malloc和free)。
- #include <stdio.h>
- #include <stdlib.h> // 包含 malloc 和 free
- #include <string.h>
- struct Person {
- char name[50];
- int age;
- char address[100];
- };
- int main() {
- // 动态分配内存给结构体
- struct Person *person1 = (struct Person *)malloc(sizeof(struct Person));
-
- if (person1 == NULL) {
- printf("Memory allocation failed\n");
- return 1;
- }
-
- // 初始化结构体成员
- strcpy(person1->name, "George");
- person1->age = 45;
- strcpy(person1->address, "789 Birch St");
-
- // 访问结构体成员
- printf("Name: %s\n", person1->name);
- printf("Age: %d\n", person1->age);
- printf("Address: %s\n", person1->address);
-
- // 释放分配的内存
- free(person1);
-
- return 0;
- }
复制代码 输出结果:
9. 结构体作为函数参数
结构体可以作为函数的参数传递。传递结构体有两种方式:按值传递和按引用传递。
按值传递
按值传递会复制整个结构体,因此函数内部的修改不会影响原始结构体。
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- };
- void printPerson(struct Person p) {
- printf("Name: %s\n", p.name);
- printf("Age: %d\n", p.age);
- }
- int main() {
- struct Person person1 = {"Helen", 50};
- printPerson(person1);
- return 0;
- }
复制代码 输出结果:
按引用传递
按引用传递通过传递指针,可以修改原始结构体。
- #include <stdio.h>
- struct Person {
- char name[50];
- int age;
- };
- void updateAge(struct Person *p, int newAge) {
- p->age = newAge;
- }
- int main() {
- struct Person person1 = {"Ivy", 55};
- printf("Before update: Age = %d\n", person1.age);
-
- updateAge(&person1, 60);
- printf("After update: Age = %d\n", person1.age);
-
- return 0;
- }
复制代码 输出结果:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |