C/C++ 笔记
QQ : 1841545843
邮箱 : jiaxx903@163.com
- 声明结构体使用typegef创建一种新的类型
struct Simple { // Simple为一个标签
......
}
typedef struct
{
int a ;
char b;
float c;
} Simple;
这个和声明一个标签的作用相同。区别在于现在Simple为一个类型而非一个标签。
2. 结构体的自引用
struct SELF_REF{
int a;
struct SELF_REF* b;
int c;
}
// 现在b是一个指针,而不是一个结构
// 编译器在结构的长度确定之前就已经知道了指针的长度
// 所以这种类型的自引用是合法的
-
不完整的声明
一个结构使用另一个结构内部以指针的形式存在。
提出一个问题:如果每个结构都引用了其他结构,那么那个结构应该首先被声明
解决方法:使用不完整声明,它声明一个作为结构标签的标识符。
可以把这个标签作用在不要知道这个结构长度的声明中。
struct B; // 不完整声明B struct A { struct B* partner; // ........... } struct B { struct A* partner; // ............ } // 这个是A中有B, B中有A
-
结构的存储分配
struct ALIGN{ char a; int b; char c; } // 整形值长度为4个字节,并且它的其实存贮位置必须被4整除 // // |a| | | |b|b|b|b|c| | | | // 系统禁止编译器在结构的起始位置跳过几个字节来满足边界对其的要求, // 因此所有结构的起始存储位置必须是结构中边界要求最严格的数据类型所要求的位置 // 可以对结构中的成员列表重新排列,让那些对边界要求最严格的成员首次出现 // 对边界要求弱的最后出现 // sizeof 能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节
联合
-
联合的所有成员引用的是内存中的相同的位置。
union { float f; int i; } fi;
-
使用联合将值和类型放到一起
struct VARIABLE{ enum { INT, FLOAT, STRING } Type; union { int i; float f; char* s; } value } // Type 决定了内存如何被访问 // 如果联合的各个成员具有不同的长度,联合的长度就是它最长成员的长度。 // 联合初始化的初始值必须是第一个类型 // 为节省空间,有一种好办法是在联合中存储指向不同成员的指针而不是直接存储成员本身