下标引用和点操作符具有相同的优先级,他们的结合性都是从左向右。
可以使用结构标签在不同的声明中创建相同类型的结构变量,typedef也可以实现这个目的。
结构的自引用
使用typedef为一个自引用的结构定义名字时应该小心。
struct SELF_REF1
{
int a;
struct SELF_REF1 b; //非法
int c;
};
上面的这种类型的自引用是非法的
struct SELF_REF2
{
int a;
struct SELF_REF1 *b;
int c;
};
上面的这种类型的自引用是合法的,如果你觉得一个结构内部包含一个指向该结构本身的指针有些奇怪,请
记住它事实上所指向的是同一种类型的不同结构。更加高级的数据结构,如链表和树,都是用这种技巧实现
的。
->操作符的优先级高于&操作符的优先级。
结构可以作为参数传递给函数,也可以作为返回值从函数返回。但是,向函数传递一个指向结构的指针往往效率更高。在结构指针参数的声明中可以加上const关键字防止函数修改指针所指向的结构。
位段(下面是一个位段声明的例子)
struct CHAR
{
unsigned ch :7;
unsigned font :6;
unsigned size :19;
};
struct CHAR ch1;
联合(union)的所有成员引用的是内存中的相同位置。
在一个成员长度不同的联合里,分配给联合的内存数量取决于它的最长成员的长度。如果成员的长度相差悬
殊,当存储长度较短的成员时,浪费的空间是相当可观的。在这种情况下,更好的方法是在联合中存储指向
不同成员的指针而不是直接存储成员本身。
联合的初始化
联合变量时可以被初始化,但这个初始值必须是联合第1个成员的类型。例如:
union{
int a;
float b;
char c[4];
}x={5};
C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。
malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。
另外还有两个内存分配函数,calloc和realloc。
calloc也用于分配内存。malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。
realloc函数用于修改一个原先已经分配的内存块的大小。
传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。
释放一块内存的的一部分是不允许的。动态分配的内存必须整块一起释放。但是,realloc函数可以缩小一块动态分配的内存,有效地释放它的尾部的部分内存。
内存泄漏是指内存被动态分配以后,当它不再使用时未被释放。内存泄漏会增加程序的体积,有可能导致程序或系统的崩溃。