目录
1. offsetof宏
我们想用宏来实现offsetof函数,首先要了解这个函数的用法。
1.1 offsetof函数的介绍及用法
(1)功能:用来计算结构体中一个成员在该结构体中的相对起始位置的偏移量,单位是字节。
(2)函数原型:
offsetof ( type , member )
(3)参数:
type: 结构体类型
member: 结构体成员
(4)使用方法:
#include <stddef.h> struct S { int a; char b; short c; }; int main() { printf("%zd\n", offsetof(struct S, a)); //0 printf("%zd\n", offsetof(struct S, b)); //4 printf("%zd\n", offsetof(struct S, c)); //6 return 0; }
画图说明:
1.2 用宏实现offsetof
我们知道,内存中的每个字节都有自己的地址,我们假设上图所示的起始位置的地址为0x0012ff40,往下依次是0x0012ff41,0x0012ff42…,所以每个成员的偏移量可以认为是该变量首地址与起始地址之差。
代码实现如下:
#include <stdio.h> #define OFFSETOF(type,member) (size_t)&((type*)0)->member struct S { int a; char b; short c; }; int main() { printf("%zd\n", OFFSETOF(struct S, a)); printf("%zd\n", OFFSETOF(struct S, b)); printf("%zd\n", OFFSETOF(struct S, c)); return 0; }
把整数0强制类型转换成结构体指针类型,再取出该成员的地址,强制类型转换为无符号整型。
2. 交换奇偶位
代码实现如下:
#include <stdio.h> #define SWAP(n) ((((n) & 0x55555555) << 1 )|((((n) & 0xaaaaaaaa) >> 1 ))) int main() { printf("%d\n", SWAP(13)); //14 return 0; }