地址、指针,无类型无符号,可以转化为指向任何类型。这种转化不会进行实际的读写,只是逻辑的计算,所以不会产生非法操作。例如本例中对NULL的转换,(abc*)0 将0地址强制转换为指向abc的指针。需要注意的一点是,虽然类型转换不会产生问题,但在对这些地址进行加减计算时却容易混淆。这是本例的重点。
例如:对一个指向int型的指针进行加1或减1的操作,实际是加4或减4,4来自于sizeof(int)。对一个指向char型的指针进行加1或减压1的操作,是进行一个加sizeof(char)或减sizeof(char)的操作。char在一般的系统上占一个字节。
对地址的加减是要乘以位于该地址的变量的sizeof()的,这就是我们计算l时,选择将(t1.next)地址类型强制转换成char *型的原因。此外,地址加减的对象应该是一个整数,这样"整数Xsizeof(类型)"才有意义。虽然上例中,我们将&(((abc*)0)->next)强制转换成char *型结果也正确,但那是巧合,实际无意义。
此外,如下定义也有意义:
unsinged long l;
l = ((unsigned long)(&(t1.next)) - (unsigned long)(&(((abc *)0)->next)));