- T1.用一个宏定义FIND求一个结构体struc里某个变量相对struc的偏移量。
{
int a;
char b[20];
double ccc;
}
则 :
FIND(student,a); //等于0
FIND(student,b); //等于4
#define FIND(struc,e) (size_t)&(((struc*)0)->e)
其中(struc*)0表示将常量0强制转化为struc*型指针所指向的地址,&(((struc*)0)->e)表示取结构体指针(struc*)0的成员e的地址。因为该结构体的首地址为0,所以其实就是得到了成员e距离结构体首地址的偏移量。
考察预处理指令要注意 括号的使用 因为会出现 边界情况
在常量整数后面添加L表示是long类型,添加UL表示的是unsigned long
mutable修饰符 修饰的变量在常函数中是可以改变这个变量的值的。
关于sizeof(struct)的大小。为了方便对结构体内元素的访问和管理,当结构体内的元素的长度
- T2. 指针和引用的差别:
(1)非空区别:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。 因此,如果你使用一个变量并让他指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时候你应该把变量声明为指针。因为这样你可以赋空值给该变量。
不存在指向空置的引用这个事实意味着使用引用的代码效率比使用指针还要高。
(2)合法性区别。在使用引用之前,不需要测试他的合法性。相反,指针则应该总是被测试,防止其为空。
(3)可修改区别。指针与引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象及其内容可以改变。