目录
- 1. offsetof宏
- 2. 交换奇偶位
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;
}