在许多Objective-C的底层库中,发现许多直接对某个结构体指针强转,转为其某个属性的指针,并对这个属性进行操作,参考探索 Block (一) (手把手讲解Block 底层实现原理)
#include <stdio.h>
struct __Imp {
float Flags;
int ptr;
};
int main(int argc, const char * argv[]) {
struct __Imp imp = {12};
float *num = (float *)&imp;
printf("%f\n", *num);
printf("%p\n", &imp);
printf("%p\n", &(imp.Flags));
return 0;
}
结果为:
12.000000
0x7ffeefbff5a8
0x7ffeefbff5a8
由上可见,可以将struct __Imp类型的地址&imp,强转为被float *指向的地址。从打印的结果看,也证明这两个地址一样。
但是必须注意到,只能强转为第一个被声明的属性类型指针。
至于这样强转的目的,是为了减少代码量。