指鹿为马
第三课
只要敢玩,理论上你可以随意指定指针类型愚弄 C 编译器,让它相信你所说的都是真的,你说鹿是马,C 编译器便对此坚信不疑,我们来看看这门 “指鹿为马” 的艺术:
指 int 为 float
int i = 37;
float f = *(float *)&i;
// &i => 取 i 的地址,类型为 int *
// (float *)&i => 指鹿为马 -- 假装它是个 float *
// *(float *)&i => 取出 float* 所指的值,类型为 float
// 以上实现了指 int 为 float,因为本质上它们都是 4 个字节排列在一起
printf("%f \n", f); // 0.000000
// i: 00000000 00000000 00000000 00100101
// f: 00000000 00000000 00000000 00100101
// 1.00000000xxxxxx * 2^(-127) 约等于 0指 float 为 short
float f = 7.0;
short s = *(short *)&f;
// &f => 取 f 的地址,类型为 float *
// (short *)&f => 指鹿为马 -- 假装它是个 short *
// *(short *)&f => 取出 short * 所指的值,类型为 short
printf("%s \n", s); // 输出结果视 endianness 而定
// Big Endian:
// f: 01000000 11100000 00000000 00000000
// s: 01000000 11100000
// Little Endian:
// f: 01000000 11100000 00000000 00000000
// s: 00000000 00000000指 double 为 char
数组与指针算术(pointer arithmetic)
结构体
如下图所示:

参考资料
Last updated