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

结构体变量的定义和初始化
- 定义结构体变量的方式:
- 先声明结构体类型再定义变量名
 - 在声明类型的同时定义变量
 
 - 语法格式: ```c // 先声明结构体类型再定义变量名 struct 结构体名 { 成员列表 }; struct 结构体名 变量名;
 
// 在声明类型的同时定义变量 struct 结构体名 { 成员列表 }变量名;
- 示例代码:```c// 结构体类型的定义struct stu {char name[50];int age;};// 先定义类型,再定义变量(常用)struct stu s1 = {"mike", 18};// 定义类型同时定义变量struct stu2 {char name[50];int age;}s2 = {"yoyo", 19};
结构体成员的使用
// 结构体类型的定义 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);
return 0;
}
<a name="Mu2jN"></a># 结构体做函数参数<a name="xTd01"></a>## 结构体值传参- 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量示例代码:```c#include <stdio.h>#include <string.h>// 结构体类型的定义struct stu {char name[50];int age;};// 函数定义void func(struct stu temp) {strcpy(temp.name, "yoyo");temp.age = 20;printf("函数内部:%s, %d\n", temp.name, temp.age);}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,值传递func(s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;}
运行结果:
函数内部:yoyo, 20函数外部:mike, 18
结构体地址传递
- 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。
 
示例代码:
#include <stdio.h>#include <string.h>// 结构体类型的定义struct stu {char name[50];int age;};// 函数定义void func(struct stu *p) {strcpy(p->name, "yoyo");p->age = 20;printf("函数内部:%s, %d\n", p->name, p->age);}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,地址传递func(&s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;}
运行结果:
函数内部:yoyo, 20函数外部:yoyo, 20
