结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //字符串处理函数头文件
//结构体struct:自定义数据类型中的一种,能够满足不同用户需要存储的不同信息
//结构体类型的声名
struct people{ //人类结构体类型
//结构体成员
int id; //编号
char name[20]; //姓名
char gender[4]; //性别
int age; //年龄
}P2, P3 = {3,"赵欣扬","男"}; //结构体声名时定义变量,并初始化赋值
/*
struct:结构体关键字
struct people:结构体类型的类型名,是个数据类型
id、name、gender、age:结构体成员
P1、P2、P3:结构体变量
*/
int main()
{
int a = 10;
int arr[10];
//arr = { 1, 2, 3, 4, 5, 6 };
//结构体声名后定义变量
struct people P1; //结构体变量的定义
//结构体成员引用符:'.'
//引用结构体成员的基本格式:结构体变量名.结构体成员名
P1.id = 1;
//P1.name = "大师兄";
strcpy(P1.name, "大师兄"); //字符串拷贝函数
strcpy(P1.gender, "男");
P1.age = 18;
printf("id:%d\nname:%s\ngender:%s\nage:%d\n", P1.id, P1.name, P1.gender, P1.age);
//struct people P2; //结构体变量的定义
scanf("%d %s %s %d", &P2.id, P2.name, P2.gender, &P2.age);
printf("id:%d\nname:%s\ngender:%s\nage:%d\n", P2.id, P2.name, P2.gender, P2.age);
struct people P4 = P1; //结构体变量之间可以相互赋值
P3.age = P2.age; //结构体成员之间也可以相互赋值
P3.age = P1.id;
system("pause");
return 0;
}
结构体的嵌套
#include <stdio.h>
#include <stdlib.h>
//结构体的嵌套:一个结构体类型中又可以有其他结构体类型的成员
struct test{
int a;
double b;
char c;
};
struct people{ //人类结构体类型
//结构体成员
int id; //编号
char name[20]; //姓名
char gender[4]; //性别
int age; //年龄
struct test t1; //结构体的成员又是其他结构体类型的变量
//struct people p; //一个结构体类型中可以有本身结构体类型的成员吗?不行
};
//一个结构体类型中可以有本身结构体类型的成员吗?
//不行,因为结构体类型没有定义完整
//函数为什么可以嵌套调用:因为有函数声名的存在
int main()
{
struct people P1;
P1.id;
P1.age;
P1.t1;
P1.t1.a = 1; //结构体的成员又是其他结构体类型的变量中成员的引用
P1.t1.b = 1.23;
system("pause");
return 0;
}
结构体数组
#include <stdio.h>
#include <stdlib.h>
//结构体数组:结构体类型的数组
struct people{ //人类结构体类型
//结构体成员
int id; //编号 4
char name[20]; //姓名 20
char gender[4]; //性别 4
int age; //年龄 4
};
struct test{
int a; //4
float b; //4
double d; //8
char c; //1
//17内存补齐为24,正好整数个存储最大成员类型double
};
int main()
{
struct people P1;
struct people P[10]; //结构体数组
P[0].id = 0; //结构体数组元素及元素中成员的引用
P[1].age = 10;
//结构体类型所占内存大小:一般来说是所有成员内存大小之和
printf("%d\n", sizeof(struct people)); //32
printf("%d\n", sizeof(struct test)); //17 ? //24
//结构体的内存大小存在内存对齐:
//整体内存大小需要能够整数个存储最大成员大小,不足的补上大小
//结构体数组内存大小:结构体类型大小*数组元素个数
system("pause");
return 0;
}
typedef的使用
#include <stdio.h>
#include <stdlib.h>
//typedef:用于给数据类型取别名
//基本格式:typedef 类型名 类型别名;
typedef int I;
//类似于#define I int;
//但是typedef除了给数据类型取别名以外,没有其他功能
//而宏定义是在编译之前做的事情,还有带参宏
//typedef printf 输出; //printf不是数据类型,typedef只能用于给数据类型取别名
typedef struct people{ //人类结构体类型
//结构体成员
int id; //编号
char name[20]; //姓名
char gender[4]; //性别
int age; //年龄
}P,P1,P2; //P、P1、P2不是变量名,而是类型别名
//typedef struct people P;
//#define P struct people;
//感觉typedef没有#define的功能那么强大
//但是某些数据类型的别名必须使用typedef定义,而不能使用#define
//比如给数组类型取别名:
typedef int arr[10]; //arr为int [10] 这种数组类型的别名
//#define int arr[10] //#define不支持这种格式
int main()
{
int a;
I b; //int b;
P P3;
P1 P4;
P2 Pn;
arr a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
system("pause");
return 0;
}
共用体
#include <stdio.h>
#include <stdlib.h>
//共用体union:成员内存共享的结构体
union test{
int a; //4
float b; //4
double d; //8
char c; //1
};
union test1{
int a; //4
int b; //4
};
union test2{
int a; //4
double b; //8
char c; //1
};
int main()
{
//共用体和结构体的使用方式类似
//union test t1;
//t1.a = 1;
//t1.b = 1.23;
//t1.c = 'a';
//t1.d = 123.456;
//printf("%d\n%f\n%c\n%lf", t1.a, t1.b, t1.c, t1.d);
union test1 t2;
t2.a = 1;
t2.b = 2;
printf("%d\t%d\n", t2.a, t2.b); //2 2
//共用体的所有成员公用同一段内存
//共用体类型的内存大小为:最大成员的内存大小
printf("%d\n", sizeof(union test1)); //4
printf("%d\n", sizeof(union test2)); //8
//共用体类型内存也存在内存对齐的情况
system("pause");
return 0;
}
枚举类型
#include <stdio.h>
#include <stdlib.h>
//枚举类型enum:枚举就是穷举,将类型所有可能的取值一一列举出来,变量只能在列举的范围内取值
//枚举类型的本质就是整型,以整型的逻辑参与运用和运算,相当于取值范围受限的整型
//枚举类型的声名
//enum Weekday{ sun, mon, tue, wed, thu, fri, sat }weekend; //枚举值默认从0开始
enum Weekday{ sun = 7, mon = 1, tue, wed, thu, fri, sat }weekend;
//星期枚举类型:从星期日到星期六
/*
enum:枚举类型关键字
enum Weekday:枚举类型的类型名
sun, mon, tue, wed, thu, fri, sat:枚举元素(枚举成员、枚举常量),枚举值默认从0开始
weekend:枚举类型变量
*/
int main()
{
//枚举变量的定义
enum Weekday workday; //工作日
workday = fri; //今天是星期五,工作日
weekend = sun; //后天是星期天,周末休息日
//枚举类型的本质就是整型,以整型的逻辑参与运用和运算
printf("workday=%d\nweekend=%d\n", workday, weekend); //5 0
//以%d的格式输出枚举变量的值
//以%d的格式输出枚举成员的值
printf("%d\n%d\n", mon, sat); //可以直接使用枚举成员
//sun = 7; //枚举元素(枚举成员、枚举常量)是个常量,常量的值无法被改变
//想要自定义枚举常量的值或者改变枚举常量的值,必须在类型声名时给定
//如果指定了部分枚举元素的枚举值,其之后没有指定枚举值的枚举元素默认在上一个枚举值的基础上+1
workday = 7; //7 == sun
if (workday == sun) //枚举类型可以用于作为比较条件
{
printf("休息,休息一下!\n");
}
else
{
printf("工作ing!\n");
}
workday = 123; //可以给枚举变量赋值范围以外的值,但是没有意义
printf("%d\n", workday);
workday = 'a'; //字符类型当作整型处理,以ASCII码值为参考
system("pause");
return 0;
}
枚举类型的应用举例
#include <stdio.h>
#include <stdlib.h>
//枚举类型的应用举例
enum dir{ 上 = 'w', 下 = 's', 左 = 'a', 右 = 'd' }; //方向枚举类型
//以字符的ASCII码给枚举元素赋初值
//游戏状态枚举
enum game{ 开始, 暂停, 结束, 退出 };
int main()
{
while (1)
{
switch (getchar())
{
case 上:
puts("向上!\n");
break;
case 下:
puts("向下!\n");
break;
case 左:
puts("向左!\n");
break;
case 右:
puts("向右!\n");
break;
}
}
system("pause");
return 0;
}