1 前言
在C语言中,结构体(struct)是一种用户自定义的复合数据类型,用于组合不同类型的数据项成为一个单独的实体。结构体可以包含多个成员,每个成员可以是不同的数据类型,例如整型、字符型、浮点型等,甚至可以是其他结构体类型。
结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
2 基本概念
2.1 定义形式
struct 结构体名{
结构体所包含的变量或数组
};
实例:
- stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。
- 结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
- 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
- 结构体也可以包含除int、float、char等基本数据类型的其他数据类型,如其他结构体等
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
2.2 复杂数据类型
- 结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
- 像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
2.3 结构体变量
结构体是一种复合数据类型,所以它和其他数据类型相同,一样有变量名。
实例:
结构体stu是一个模板
stu1,stu2是两个结构体类型的变量。
//书写方式一
struct stu(结构体名){
结构体所包含的变量或数组
};
struct stu stu1,stu2;
//书写方式二
struct stu(结构体名){
结构体所包含的变量或数组
}stu1,stu2;
//书写方式三 注意:此方法不可再用这个结构体“模子”
struct {
结构体所包含的变量或数组
}stu1,stu2;
3 结构体在内存中的存储
结构体中成员的存储是连续的,有时会存在“裂缝”
struct NULL{
//占字节:0
};
struct stu1{
int name; //4
float score; //4
char sex; //1
short num; //2
//本应占内存字节:11=4+4+1+2
//实际占内存字节:12
};
遇到char和short数据类型在一起可以和在一起当成4字节。
具体原因......未待完续
4 结构体成员的获取和赋值
逐一赋值
#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1;
//给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}
定义时,整体赋值
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };