概述

  • 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性
    • 这时候可通过结构体实现
  • 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”

image.png

结构体变量的定义和初始化

  • 定义结构体变量的方式:
    • 先声明结构体类型再定义变量名
    • 在声明类型的同时定义变量
  • 语法格式: ```c // 先声明结构体类型再定义变量名 struct 结构体名 { 成员列表 }; struct 结构体名 变量名;

// 在声明类型的同时定义变量 struct 结构体名 { 成员列表 }变量名;

  1. - 示例代码:
  2. ```c
  3. // 结构体类型的定义
  4. struct stu {
  5. char name[50];
  6. int age;
  7. };
  8. // 先定义类型,再定义变量(常用)
  9. struct stu s1 = {"mike", 18};
  10. // 定义类型同时定义变量
  11. struct stu2 {
  12. char name[50];
  13. int age;
  14. }s2 = {"yoyo", 19};

结构体成员的使用

  • 如果是结构体变量,通过 . 操作成员
  • 如果是结构体指针变量,通过 -> 操作成功 ```c

    include

    include

// 结构体类型的定义 struct stu { char name[50]; int age; };

int main() { // 定义结构体变量,同时初始化 struct stu s = {“mike”, 18}; // 打印成员变量 printf(“%s, %d\n”, s.name, (&s)->age); // 修改成功变量的内容 strcpy(s.name, “yoyo”); s.age = 19; // 打印成员变量 printf(“%s, %d\n”, s.name, (&s)->age);

  1. return 0;

}

  1. <a name="Mu2jN"></a>
  2. # 结构体做函数参数
  3. <a name="xTd01"></a>
  4. ## 结构体值传参
  5. - 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量
  6. 示例代码:
  7. ```c
  8. #include <stdio.h>
  9. #include <string.h>
  10. // 结构体类型的定义
  11. struct stu {
  12. char name[50];
  13. int age;
  14. };
  15. // 函数定义
  16. void func(struct stu temp) {
  17. strcpy(temp.name, "yoyo");
  18. temp.age = 20;
  19. printf("函数内部:%s, %d\n", temp.name, temp.age);
  20. }
  21. int main() {
  22. // 定义结构体变量
  23. struct stu s = {"mike", 18};
  24. // 调用函数,值传递
  25. func(s);
  26. // 打印成员变量
  27. printf("函数外部:%s, %d\n", s.name, (&s)->age);
  28. return 0;
  29. }

运行结果:

  1. 函数内部:yoyo, 20
  2. 函数外部:mike, 18

结构体地址传递

  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. // 结构体类型的定义
  4. struct stu {
  5. char name[50];
  6. int age;
  7. };
  8. // 函数定义
  9. void func(struct stu *p) {
  10. strcpy(p->name, "yoyo");
  11. p->age = 20;
  12. printf("函数内部:%s, %d\n", p->name, p->age);
  13. }
  14. int main() {
  15. // 定义结构体变量
  16. struct stu s = {"mike", 18};
  17. // 调用函数,地址传递
  18. func(&s);
  19. // 打印成员变量
  20. printf("函数外部:%s, %d\n", s.name, (&s)->age);
  21. return 0;
  22. }

运行结果:

  1. 函数内部:yoyo, 20
  2. 函数外部:yoyo, 20