C语言:定义和利用结构体变量

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

介绍

在C语言中,结构体(struct)是一种用户定义的数据类型,它允许我们将差别类型的数据组合在一起。结构体对于处理干系联的数据非常有效,好比将一个人的姓名、年龄和地址组合在一起。
根本用法

1.定义结构体

定义结构体的语法如下:
  1. struct 结构体名 {
  2.     数据类型 成员名1;
  3.     数据类型 成员名2;
  4.     ...
  5.     数据类型 成员名N;
  6. };
复制代码
比方,我们可以定义一个表示人的结构体:
  1. #include <stdio.h>
  2. // 定义结构体
  3. struct Person {
  4.     char name[50];
  5.     int age;
  6.     char address[100];
  7. };
复制代码
2. 声明结构体变量

在定义告终构体之后,我们可以声明结构体变量:
  1. // 声明结构体变量
  2. struct Person person1;
复制代码
我们也可以在定义结构体时同时声明结构体变量:
  1. struct Person {
  2.     char name[50];
  3.     int age;
  4.     char address[100];
  5. } person1, person2;
复制代码
3. 初始化和访问结构体成员

我们可以利用点运算符(.)来访问和赋值结构体的成员:
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5.     char address[100];
  6. };
  7. int main() {
  8.     // 声明并初始化结构体变量
  9.     struct Person person1 = {"Alice", 30, "123 Main St"};
  10.    
  11.     // 访问结构体成员
  12.     printf("Name: %s\n", person1.name);
  13.     printf("Age: %d\n", person1.age);
  14.     printf("Address: %s\n", person1.address);
  15.    
  16.     // 修改结构体成员
  17.     person1.age = 31;
  18.     printf("Updated Age: %d\n", person1.age);
  19.    
  20.     return 0;
  21. }
复制代码
输出结果:

4. 利用指针访问结构体成员

我们还可以通过指针访问结构体成员,利用箭头运算符(->):
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5.     char address[100];
  6. };
  7. int main() {
  8.     struct Person person1 = {"Bob", 25, "456 Elm St"};
  9.     struct Person *ptr_person = &person1;
  10.    
  11.     // 使用指针访问结构体成员
  12.     printf("Name: %s\n", ptr_person->name);
  13.     printf("Age: %d\n", ptr_person->age);
  14.     printf("Address: %s\n", ptr_person->address);
  15.    
  16.     // 通过指针修改结构体成员
  17.     ptr_person->age = 26;
  18.     printf("Updated Age: %d\n", ptr_person->age);
  19.    
  20.     return 0;
  21. }
复制代码
输出结果:

5. 利用结构体数组

偶然候我们需要处理多个相同类型的结构体变量,这时可以利用结构体数组:
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5.     char address[100];
  6. };
  7. int main() {
  8.     // 定义结构体数组
  9.     struct Person people[2] = {
  10.         {"Charlie", 22, "789 Maple St"},
  11.         {"Dana", 28, "101 Oak St"}
  12.     };
  13.    
  14.     for (int i = 0; i < 2; i++) {
  15.         printf("Person %d:\n", i + 1);
  16.         printf("  Name: %s\n", people[i].name);
  17.         printf("  Age: %d\n", people[i].age);
  18.         printf("  Address: %s\n", people[i].address);
  19.     }
  20.    
  21.     return 0;
  22. }
复制代码
输出结果:

高级用法

6. 嵌套结构体

结构体可以包含其他结构体作为它的成员,这称为嵌套结构体。嵌套结构体可以帮助我们创建更加复杂的数据结构。
  1. #include <stdio.h>
  2. struct Address {
  3.     char street[100];
  4.     char city[50];
  5.     char state[20];
  6.     int zip;
  7. };
  8. struct Person {
  9.     char name[50];
  10.     int age;
  11.     struct Address address; // 嵌套结构体
  12. };
  13. int main() {
  14.     struct Person person1 = {"Emily", 35, {"123 Oak St", "Springfield", "IL", 62704}};
  15.    
  16.     printf("Name: %s\n", person1.name);
  17.     printf("Age: %d\n", person1.age);
  18.     printf("Address: %s, %s, %s, %d\n",
  19.            person1.address.street,
  20.            person1.address.city,
  21.            person1.address.state,
  22.            person1.address.zip);
  23.    
  24.     return 0;
  25. }
复制代码
输出结果:

7. 匿名结构体

在某些情况下,我们可以利用匿名结构体来简化代码。匿名结构体没有名字,可以直接利用。
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5.     struct {
  6.         char street[100];
  7.         char city[50];
  8.         char state[20];
  9.         int zip;
  10.     } address; // 匿名结构体
  11. };
  12. int main() {
  13.     struct Person person1 = {"Frank", 40, {"456 Pine St", "Riverdale", "NY", 10567}};
  14.    
  15.     printf("Name: %s\n", person1.name);
  16.     printf("Age: %d\n", person1.age);
  17.     printf("Address: %s, %s, %s, %d\n",
  18.            person1.address.street,
  19.            person1.address.city,
  20.            person1.address.state,
  21.            person1.address.zip);
  22.    
  23.     return 0;
  24. }
复制代码
输出结果:

8. 结构体和动态内存分配

在处理大型数据集或需要动态创建结构体时,可以利用动态内存分配(如malloc和free)。
  1. #include <stdio.h>
  2. #include <stdlib.h> // 包含 malloc 和 free
  3. #include <string.h>
  4. struct Person {
  5.     char name[50];
  6.     int age;
  7.     char address[100];
  8. };
  9. int main() {
  10.     // 动态分配内存给结构体
  11.     struct Person *person1 = (struct Person *)malloc(sizeof(struct Person));
  12.    
  13.     if (person1 == NULL) {
  14.         printf("Memory allocation failed\n");
  15.         return 1;
  16.     }
  17.    
  18.     // 初始化结构体成员
  19.     strcpy(person1->name, "George");
  20.     person1->age = 45;
  21.     strcpy(person1->address, "789 Birch St");
  22.    
  23.     // 访问结构体成员
  24.     printf("Name: %s\n", person1->name);
  25.     printf("Age: %d\n", person1->age);
  26.     printf("Address: %s\n", person1->address);
  27.    
  28.     // 释放分配的内存
  29.     free(person1);
  30.    
  31.     return 0;
  32. }
复制代码
输出结果:

9. 结构体作为函数参数

结构体可以作为函数的参数传递。传递结构体有两种方式:按值传递和按引用传递。
按值传递

按值传递会复制整个结构体,因此函数内部的修改不会影响原始结构体。
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5. };
  6. void printPerson(struct Person p) {
  7.     printf("Name: %s\n", p.name);
  8.     printf("Age: %d\n", p.age);
  9. }
  10. int main() {
  11.     struct Person person1 = {"Helen", 50};
  12.     printPerson(person1);
  13.     return 0;
  14. }
复制代码
输出结果:

按引用传递

按引用传递通过传递指针,可以修改原始结构体。
  1. #include <stdio.h>
  2. struct Person {
  3.     char name[50];
  4.     int age;
  5. };
  6. void updateAge(struct Person *p, int newAge) {
  7.     p->age = newAge;
  8. }
  9. int main() {
  10.     struct Person person1 = {"Ivy", 55};
  11.     printf("Before update: Age = %d\n", person1.age);
  12.    
  13.     updateAge(&person1, 60);
  14.     printf("After update: Age = %d\n", person1.age);
  15.    
  16.     return 0;
  17. }
复制代码
输出结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表