1.声明结构
//申明结构时可以使用的另一种方法是使用typedef创建一个新的类型。
typedef struct{
int a;
char b;
float c;
}Simple;
//这个方法和声明一个结构标签的效果几乎相同
//区别在于Simple现在是一个类型名而不是结构标签
//后续声明
Simple x;
Simple y[20], *z;
注:如果你想在多个源文件中使用同样种类型的结构,你应该把标签声明或typedef形式的声明放在一个头文件中。当源文件需要这个声明时可以使用#include 质量把那个头文件包含进来
2.访问成员
通过点操作符(.)完成访问。
struct COMPLEX{
float f;
int a[20];
long *lp;
struct SIMPLE s;
struct SIMPLE sa[10];
struct SIMPLE *sp;
};
struct COMPLEX comp;
comp.a是一个数组名。comp.s是一个结构名。(comp.s).a选择结构comp的成员s的一个成员a,结果是一个成员,和comp.s.a等价。
comp.sa是一个结构数组名,它的值是一个指针常量。
>操作符(箭头操作符)可以完成间接访问操作,箭头操作符接受两个操作数,左操作数必须是一个指向结构的指针 ,箭头操作符对左操作数执行间接访问取得指针所指向的结构,然后和点操作符一样,根据右操作数选择一个指定的结构成员。
void func(struct COMPLEX *cp);
(*cp).f
cp->f //这两种写法功能一致
3.结构的存储分配
系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始存储位置必须是结构中边界要求最严格的数据类型所要求的位置。
可以在声明中对结构的成员列表重新排列,让那些对边界要求最严格的成员首先出现,对边界要求最弱的成员最后出现,这种做法可以最大限度减少因边界对齐而带来的空间损失。
sizeof能得出一个结构完整长度,包括结构中浪费的内存空间。
4.作为函数参数的结构
结构可以作为参数传递给函数,也可以作为返回值从函数返回,但是向函数传递一个指向结构的指针效率更高。在结构指针的参数声明上可以加上const关键字防止函数修改指针所指向的结构。
5.联合
联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。