八、结构体,联合体
1. 说明
结构体:
- 类似Java中的封装类
联合体:
- 所有字段公用一块内存空间
2. 实例
#include<stdio.h>
/*
联合体,结构体,结构体指针
*/
//定义一个结构体
struct Student {
int age;
float score;
char sex;
};
//定义一个联合体:所有字段公用一块内存空间
//使用优势:方便类型转换
union Mix{
long i; //4byte
int k; //4byte
char ii;//1btyp
};
int main(Void){
//size data:12 //结构体中总体字段长度
printf("size data:%d\n",sizeof(struct Student));
//size mix: 4 //联合体中最大字段长度
printf("size mix: %d\n",sizeof(union Mix));
/*
结构体
*/
//结构体的使用
struct Student stu={
16,90.5,'F'
};
//age: 16,score: 90.5,sex: F //结构体赋值
printf("age: %d,score: %.1f,sex: %c\n",stu.age,stu.score,stu.sex);
//结构体赋值
stu.age = 22;
//age: 22 //结构体取值
printf("age: %d\n",stu.age);
/*
结构体指针
*/
struct Student* point = &stu;//一级指针
struct Student** point2 = &point;//二级指针
//一级结构体指针取值,以下两种方式等价
//(*point).age: 22 //一级结构体指针取值
printf("(*point).age: %d\n",(*point).age);
//point->age: 22
printf(" point->age: %d\n",point->age);
//一级结构体指针赋值
// point->age: 99 //一级结构体指针赋值
point->age = 99;
printf(" point->age: %d\n",point->age);// point->age: 99
//二级结构体指针取值,注意两种方式都要加括号()
printf("(**point).age: %d\n",(**point2).age);//(**point).age: 99
printf(" *point->age: %d\n",(*point2)->age);// *point->age: 99
//二级结构体指针赋值
// *point->age: 77
(*point2)->age = 77;
printf(" *point->age: %d\n",point->age);
/*
联合体
*/
//联合体的使用
union Mix m;
m.i = 100;
m.k = 123;
//value m.i = 123 //由于使用同一块内存空间,被后赋值所覆盖
printf("value m.i = %d\n",m.i);
//value m.k = 123
printf("value m.k = %d\n",m.k);
return 0;
}
九、枚举
1. 说明
- 有限个类,值自增
2. 实例
#include<stdio.h>
/*
枚举 :
枚举的值递增
默认首元素为0
*/
//定义枚举
enum WeekDay{
Monday = 0,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
int main(void){
enum WeekDay day = Sunday;
printf("%d\n",day);//Log: 6 --> 枚举递增
return 0;
}
十、别名
1. 说明
- 一种编译时处理的声明
- 用来简化代码编写
2. 实例
#include<stdio.h>
/*
1. 声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的
2. 用来为复杂的声明 定义简单的别名
3. 在编译阶段处理(区别"#define N 4"是预处理指令)
*/
typedef int i;
typedef long l;//如果原有数据类型名字很长,使用别名
int main(void){
i a = 10;
l b = 100;
printf("a = %d,b = %d",a,b);//a = 10,b = 100
}