- 通过本文,你将学到:
- 什么是结构体,结构体的基本特征;
- 定义一个结构体;
- 申明和使用结构体变量
什么是结构体
struct 结构体名字(可有可无)
{
数据类型
……
};
- 形如上面一样:含有“struct”关键字,含有一对“{ }”,至少含有一个数据类型,和含有一个“;” —— 由这样组成格式,就被称作结构体!
- 结构体也是一种数据类型,只不过它不同于形如int、char、float等这种基本的数据类型,不同之处在于它可以:
- 整合多个同类型的,为一种新类型(当然,这种新类型也是一种数据类型,是你创造的);
- 整合多种不同类型的,为一种新的类型;
- 总而言之,你可以利用已经存在的数据类型创造新的数据类型!
- 学习结构体,就像是在学习int一样;只是结构体的定义内容要多一点而已;
结构体的特征
//一个完美的结构体
struct 结构体名
{
成员1;
成员2;
……
}变量名1,变量名2,……;
- 在结构体名与成员列表与变量名列表的三个类别中,至少要出现两个才能是正确的结构体;
- 像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
- C语言要求结构体至少得有一个成员,也就是说C语言并不允许空结构体的出现!
结构体的两种类型
- 标准结构体:
struct 结构体名 { 数据类型…… }结构体变量名;
- 匿名结构体:(即没有结构体名)
struct { 数据类型…… }结构体变量名;
定义结构体(变量)
1、先定义结构体类型,再定义变量
struct stu { //定义一个结构体,这种数据类型是 “struct stu”;
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
- 既然结构体是一种数据类型,那么就可以用它来定义变量。例如:
struct stu stu1, stu2; //stu1、stu2就是结构体变量;
- 定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字struct不能少。
- stu 就像一个“模具”,定义出来的变量都具有相同的性质。
2、定义结构体的同时就定义变量
struct{ //没有写 stu,后面就没法用该结构体定义新的变量。
char *name; //姓名,结构体成员变量
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2; //在定义时就初始化两个结构体变量;
3、直接定义结构体类型变量,省略类型名
struct {
char *name;
int age;
} stu;
结构体变量
把结构体变量想象成int型变量或者是其他基础类型的变量即可。
struct 结构体名 结构体变量名; ===>>> int int型变量名;
结构体变量的引用四种方式:
1) 结构体变量名.成员名:stu1.name
2) 结构体指针变量成员名:ps->name
3) (*结构体指针变量).成员名:(*ps).name 因为优先级的问题,所以要加括号
4) 结构体变量数组名.成员名:stu[0].name
//示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
char* name;
int age;
};
int main()
{
struct MyStruct person_a; //结构体变量,类比于:int a;
person_a.name = "aaa";
person_a.age = 10;
printf("%s,%d\n", person_a.name, person_a.age);
struct MyStruct* person_b = NULL; //结构体指针,类比于:int *a;
person_b = (struct MyStruct*)malloc(sizeof(struct MyStruct) * 1);
person_b->name = "bbb";
person_b->age = 20;
printf("%s,%d\n", person_b->name, person_b->age);
printf("%s,%d\n", (*person_b).name, (*person_b).age);
struct MyStruct persons[5]; //结构体数组,类比于:int a[5];
int i;
for (i = 0; i < 5; i++)
{
persons[i].name = "x";
persons[i].age = 0;
}
printf("%s,%d\n", persons[0].name, persons[0].age);
return 0;
}