33.对指针进行解引用操作之前,检查一下它是否有效是非常重要的。(所谓“解引用”,即“*”操作,英文为dereference,其实意思就是取指针指向的地址的内容。)
34.要确定结构中某个成员的实际位置,应考虑边界对齐因素,可以使用offsetof宏(定义于stddef.h)。
offsetof(type, member)
type是结构的类型,member是所需要的那个成员表达式的结果是一个size_t值,表示这个指定成员开始存储的位置距离结构开始位置偏移了几个字节。
35.向函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改。如果我们不希望如此,可以在函数中使用const关键字来防止这类修改。
36.位段的声明和结构类似,但它的成员是一个或多个位的字段,这些不同长度的字段实际上存储于一个或多个整型变量中。
37.位段声明与任何普通结构成员的不同点有两个,一是位段成员必须声明为int、signed int或unsigned int类型,其次是在成员名后面是一个冒号和一个整数,这个整数指定该位所占用的位的数目。
38.注重可移植性的程序应该避免使用位段。注意下面这些:
①int位段被当作有符号数还是无符号数。
②位段中位的最大数目。许多编译器把位段成员的长度限制在一个整型值的长度之内,所以一个能够运行于32位整数的机器上的位段声明可能在16位整数的机器上无法运行。
③位段中的成员在内存中是从左右分配的还是从右向左分配的。
④当一个声明指定了两位段,第2个位段比较大,无法容纳于第1个位段剩余的位时,编译器有可能把第2位位段放在内存的下一个字,也可能直接放在第1个位段后面,从而在两个内存位置上形成重叠。
39.位段提供的唯一优点是简化源代码。这个优点必须与位段的可移植性弱的缺点进行权衡。