概述
- 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性
- 这时候可通过结构体实现
- 结构体(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