目录
1.1 我们可以使用#define定义常量,为什么非要使用枚举?
一. 结构体
1.0 C语言中为什么要引入结构体?
一组数据中往往具有不同的类型,而普通的基本类型无法满足实际要求 如:一本书(书名,作者,生产日期,售价),学生(年龄,学号,成绩,联系方式)等,因此为了表示这些复杂的事物,这时就引入了结构体
结构(体)是一些值得集合,这些值称为成员变量。结构得每个成员可以是不同类型的变量
1.1 结构体的声明
struct tag //结构体类型名称
{
member-list; //成员列表
}variable-list; //变量列表
例:
描述一个学生的属性
struct stu1
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
}; //注意这里最后的分号一定要有
我们可以对这种自定义结构体进行简化:
->1.声明结构体的时候直接用typedef替换
typedef struct stu1
{
char name[20];
int age;
char sex[5];
}stu1;
stu1 s1; //用typedef替换之后就可以直接用stu1 s1直接创建变量了
->2.声明之后再使用typedef替换
struct stu1
{
char name[20];
int age;
};
typedef struct stu1 stu1;
1.2 特殊的声明
匿名结构体变量,又叫不完全声明,创建时同时声明变量只能使用一次,再去main函数中声明另一个变量就不行了
struct //没有结构体名称
{
char name[20];
int age;
}s1;
以上两种都可以
注意:
->1.如果在声明匿名结构体时没有声明结构体变量,后续是不能使用的
->2.
#include <stdio.h>
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
void main()
{
p = &x;
}
由上图可知:在编译器看来这两个是不同的匿名结构体只能使用一次,系统认定p和x是两个不同的变量,所以会报警告说两边类型不兼容。p = &x是可以使用的,但是p = &x是非法的,不建议去这么使用
举个例子理解一下:别人掉了钱你捡到了,你可以使用,但是不合法
1.3 结构体变量的定义和初始化
如何定义和初始化呢?
->1.声明结构体的同时定义结构体变量s1
struct stu1
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
}s1;
->2.声明结构体的同时定义结构体变量s1以及初始化
struct stu1
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
}s1 = {"zyx", 20, "男"};
->3.定义结构体变量
struct stu1 s2;
->4.定义变量的同时初始化struct stu2
struct stu1 s3 = {"zyx", 20, "男"};
->5. 结构体嵌套结构体
struct stu2
{
int age;
struct stu1 s4;
}p1 = {20, {"zyx", 20, "男"},};
struct stu2 p2 = {20, {"zyx", 20, "男"},};
它们都是在函数之外的声明,所以s1,s2... 是全局变量,在我们编程过程中少使用全局变量,如果代码量大的话不利于后期维护 ,所以还是尽量使用局部变量在函数中定义和声明结构体变量
二. 枚举
枚举顾名思义就是一一列举,把可能的取值一一列举出来,例:一周的星期一...日,月份,男女性别
1.0 类型的定义
enum color
{
RED,
GREEN,
BLUE
};
(1). 若定义的时没有初始化则默认从0,1,2 ...按顺序赋值
如图所示:
(2). 如果给enum中任意一个成员赋值,则后面的成员都会往下按顺序增1
如图所示:
注意:
#include <stdio.h>
enum color
{
RED,
GREEN = 6,
BLUE
};
int main()
{
enum color c1 = 0;
printf("%d", c1);
return 0;
}
enum color c1 = 0; 虽然可以使用但是不建议这样写,左右类型不匹配,c1是枚举类型而0是整型
1.1 我们可以使用#define定义常量,为什么非要使用枚举?
优点:
->1. 增加代码的可读性和可维护性 例:用枚举可以优化通讯录(通讯录系统)将case后的数换成枚举成员更容易让人理解
->2. 和#define定义的标识符比较枚举有类型检查,更加严谨
->3. 防止命令污染,进行了封装,将类型写在大括号中(统一类型)
->4. 便于调试(#define在预处理阶段就消失了)
->5. 使用方便,一次可以定义多个常量
三. 联合(共用体)
1.0 联合类型的定义
特殊的自定义类型,这种类型定义的变量也包含一系列的成员
特征:这些成员共用同一块空间(所以联合也叫共用体)
1.1 联合的声明
union UN
{
char c;
int i;
}un;
大小至少4个字节,因为至少要将i给装起来
int main()
{
printf("%p\n", &un);
printf("%p\n", &un.c);
printf("%p\n", &un.i);
}
可以看到共用体中的成员地址都是一样的,这也证明了它们共用空间
两个成员不可同时使用
从这两张图中可以看到当un.i后赋值时共用体union UN中装的就是1,un.c后赋值时union UN中装的就是字符a
例:
判断大小端(使用联合体判断)
int check_sys()
{
union UN
{
char c;
int i;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret = cheak_sys();
if(ret == 1)
{
printf("小端");
}
else
{
printf("大端");
}
}
标签:stu1,20,struct,自定义,int,char,枚举,类型,结构
From: https://blog.csdn.net/m0_73634434/article/details/139774819