结构体基本概念
构造类型 : 由已有的数据数据类型构成类型
1.数组 : 多个同种数据类型的数据构成的那么一种类型
特点 : 只能存放一种数据类型
2.结构体 : 用来存放表示某种特定含义的一组数据
它是对数据的封装
函数对功能的封装
好处 : 提高代码的可读性
提高数据的易用性
提高代码的可维护性
定义结构体 :
1 . 定义结构类型
2 .通过结构体类型定义结构变量
strcut 结构类型名称 结构体变量名称;
定义一个结构体类型
struct Person {
int age;
char sex;
double height;
double weight;
char *name;
};
// 定义结构体变量
struct Person person;
Person.age = 10;
Person.sex = ‘M';
Person.weight = 20;
Person.height = 1.2;
Person.name = "小明";
—————————————————————
结构体初始化
// 一 一符值
Person.age = 10;
Person.sex = ‘M';
Person.weight = 20;
// 整体赋值 要强转
赋值的时候 , { }中元素的顺序与定义结构体时成员顺序相同
p1 = (strcut Person) {20,"小明",2.0}
定义结构体变量的同时进行初始化
struct Person P2 = {15;"小红";1.5};
同种类型的结构体之间可以相互赋值
p1 = p2;
—————————————————————
结构体类型定义多种方式 :
在函数内部 , 结构类型作用域就如同局部变量一样
在外边定义的结构体类型像全局变量的作用域
作用域 : 从定义的那一行开始知道文件的结束
注意点 : 结构体类型不能声明
结构体类型的作用域 , 除了不能声明以外, 其他都一样
第一种方式
1.先定义结构体类型
2.定义结构变量
struct Person{
int age;
double height;
} ;
struct Person p1;
第二种 定义结构体类型的同时定义结构变量
struct Person{
int age;
double height;
} p1, p2 = { 20,1.7 };
int num,num1,num2;
p1 = (struct Person){10,1.2};
printf("age =%d,height=%.2lf\n",p1.age,p1.geight);
第三种 定义匿名的结构类型的同时定义结构体变量
struct Person{
int age;
char sex;
} p1 , p2;
p1.age = 10;
p1.sex = 'W';
printf("age = %d,sex = %c\n",p1.age,p1.sex);
// p1 = (struct) {10,'W’};
1.不支持整体赋值
2.结构体类型不能重复使用
struct Person{
int age;
char sex;
} p1 , p2 = {10,'W'};
;
——————————————————
细节
1 .结构体变量的地址就是第一个成员的地址
2 .结构体类型本身是不占用存储空间的 , 就如同int 是不占用存储空间的一样
3 .对于相同数据类型的结构体所占用的存储空间为所有成员之和
struct Data{
int year;
int month;
int day;
};
struct Date date;
printf("%p\n",&date);
printf("%p\n",&date.year);
// 为了快速访问数据 , 结构体内部有一个补齐算法, 默认情况下他一定是占用存储空间最大的成员倍数
1 . 默认情况一组占用多少个字节取决于最大成员所占用的存储空间
2 .
//指定一组占多少字节
#pragma pack(1)
struct Person{
int age;
char sex;
}
size_t size = sizeof(struct Date);
printf("%lu\n”,size);
枚举
枚举: 一个一个列举出来
作用: 消除魔法数字
使用场景: 当某个东西只有几个取值的时候就用枚举
定义枚举格式
enum 枚举类型名称 {
元素 ,//逗号
….
};
注意点:
1.枚举类型定义中 , 所有元素都是整形常量
2.枚举类型的本质就是整形
//定义枚举类型
enum Sex{
Man,
Woman,
Othwe
};
// 可以定义枚举中每一个元素值
enum Season{
Spring = 1,
Summer,
Autumn = 5,
Winter
};
int Man = 10; //枚举定以之后 , 后面不可定义与成员相同变量
int main(){
enum Sex sex;
sex = Man;
Man = 10; //这里不能把数字赋值给一个枚举类型的变量, 这样枚举存在的意义就没有了
}