结构体基础知识:
1.概念:
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
如何声明
struct tag { member-list; }variable-list;
例如如何描述一个学生
struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }; //分号不能丢
1.2特殊结构体的声明
struct { int age; int xuehao; }st;
上面的两个结构在声明的时候省略掉了结构体标签(tag)。
那么问题来了?下面这段代码声明的合法吗
警告:
编译器会把上面的两个声明当成完全不同的两个类型。
所以是非法的1.3结构体的自引用
先来看第一种情况我们如果直接引用看看结果会怎么样
//代码1 struct Node { int data; struct Node next; }; //可行否? 如果可以,那sizeof(struct Node)是多少?
我在编译器试过了直接就是报错
下面是正确使用方法
枚举:
概念:就是把情况一一列举出来比如:星期,还有课程等等
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
比如上面中的一些情况
初始值:从0开始也可以给他赋初始值
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
优点相较于#define
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性用通讯录来举例
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试即使赋值给他在程序中我们可以通过调试来看到
5. 使用方便,一次可以定义多个常量
联合
概念:联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
联合相对于结构体而言,有一个很大区别来看下面俩附图
联合;只分配一块内存空间这一块内存空间是公用的,修改一个的同时也会修改其他的,而且会以最大的那个内存为他的大小,会存在内存对齐
结构体
对其中每一块数据进行独立分块管理,修改其中一个对其他的没有影响
来看下面一个练习看看输出的结果是啥
union Un
{
int i;
char c;
};
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
结果是 0x55223344这个看编译器的大小端存储
正好通过此次我们可以使用联合体来看一个存储器的大小端存储模式,
int my_uinio()
{
union
{
char a;
int b;
}u;
u.b = 1;
u.a = 0;
return u.a;
}
int main()
{
int ret = my_uinio();
if (ret == 0)
{
printf("da");
}
else
{
printf("xiao");
}
return 0;
}