结构体
文章目录
1.结构体的引出
看一个养猫猫问题
张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。
使用传统技术解决
(1) 单独的定义变量解决
_______________________________
int main(){
char cat1Name[10] = "小白";
int cat1Age = 3;
char cat1Color[10] = "白色";
} //一只猫就需要定义三个变量,太多了且管理起来太麻烦
________________________________
(2) 我们学习了数组,它是一组具有相同类型的数据的集合。在编程中,我们往往还需要一组类型不同的数据,例如猫的名字使用字符串、年龄是int,因为数据类型不同,不能用一个数组来存放
_________________________________
char *catName[2] = {
"小白",
"小花";
};
int *catAge[2] = {3,100};
//取得时候需要考虑下标对等,不利于数据的管理与维护
__________________________________
缺点总结:
不利于数据的管理和维护,因为本身猫的三个属性(名字,年龄,颜色)是一个整体,传统解决方法是将其分解 ==>>结构体因此提出
2.结构体与结构体变量的关系示意图
3.快速入门面向对象的方式(struct)解决养猫问题
#include <stdio.h>
int main(){
//分析
//1.猫猫有三个成员(变量)组成
//2.使用结构体解决
//创建 结构体Cat [是数据类型]
struct Cat{
//结构体名 Cat Cat就是我们自己构造的一个数据类型
char*name;//名字,使用指针,指向一个字符串
int age;//年龄
char*color;//颜色
};
//使用Cat结构体,创建变量
struct Cat cat1;//cat1 就是struct Cat 的一个变量
struct Cat cat2;
//给cat1的各个成员赋值
cat1.name = "小白";
cat1.age = 3;
cat1.color = "白色";
//给cat2的各个成员赋值
cat2.name = "小花";
cat2.age = 100;
cat2.color = "花色";
//输出两只猫的信息
printf("\n 第一只猫 name=%s age=%d color=%s",cat1.name,cat1.age,cat1.color);
printf("\n 第一只猫 name=%s age=%d color=%s",cat2.name,cat2.age,cat2.color);
return 0;
}
4.结构体和结构体变量的区别和联系
通过上面的案例和讲解我们可以看出:
(1)结构体是自定义的数据类型,表示的是一种数据类型.
(2)结构体变量代表一个具体变量,好比
int num1 ; // int 是数据类型, 而num1 是一个具体的int变量
struct Cat cat1; // Cat 是结构体数据类型, 而cat1 是一个Cat变量
(3)Cat 就像一个“模板”,定义出来的结构体变量都含有相同的成员。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的
5.结构体变量在内存的布局
6.如何声明结构体
struct 结构体名称 {
// 结构体名首字母大写,比如Cat, Person
成员列表;
};
举例:
struct Student{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
//成员也可以是结构体
};
7.成员
(1)基本语法
- 从叫法上看:有些书上称为成员, 有些书说 结构体包含的变量
- 成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等 。比如我们前面定义Cat结构体 的 int age 就是一个成员。
(2)注意事项和细节说明
- 1)成员声明语法同变量,示例: 数据类型成员名;
- 2)字段的类型可以为:基本类型、数组或指针、结构体等
- 3)在创建一个结构体变量后,需要给成员赋值,如果没有赋值就使用可能导致程序异常终止。[ 案例演示 ]:
- 4)不同结构体变量的成员是独立,互不影响,一个结构体变量的成员 更改,不影响另外一个。
8.创建结构体和结构体变量
(1)方式1-先定义结构体,然后再创建结构体变量
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
struct Stu stu1, stu2;
//定义了两个变量 stu1 和 stu2,它们都是 Stu 类型,都由 5 个成员组成
//注意关键字struct不能少
(2)方式2-在定义结构体的同时定义结构体变量
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//在定义结构体Stu 的同时,创建了两个结构体变量 stu1 和 stu2
(3)方式3-如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体数据类型,定义其他变量,在定义时也可以不给出结构体名
struct {
//没有写 Stu
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
stu1.name = "tom"; stu1.num = 100;....
//1. 该结构体数据类型,没有名, 匿名结构体
//2. stu1 和 stu2 就是 该结构体的两个变量
9.成员的获取和赋值
结构体和数组类型,也是一组数据的集合,整体使用没有太大的意义,数组使用下标[]获取单个元素,结构体使用点号获取单个成员,获取结构体成员的一般格式为结构体变量名.成员名
(1)案例1
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1;
stu1.name = "jack";
printf("%s", stu1.name);
(2)案例2
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}
struct Stu stu1,stu2;
stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };
10.结构体应用实例
步骤
(1)声明(定义)结构体,确定结构名
(2)编写结构体成员
(3)编写处理结构体的函数
小狗案例:
盒子案例:
景区门票案例:
``