网站首页做多大分辨率,规划设计公司,建设局网站投诉开发商,销售培训课程一般有哪些#x1f970;欢迎关注 轻松拿捏C语言系列#xff0c;来和 小哇 一起进步#xff01;✊ #x1f308;感谢大家的阅读、点赞、收藏和关注 #x1f495;希望大家喜欢我本次的讲解#x1f495; 目录#x1f451;
1、写一个宏#xff0c;计算结构体中某变量相对于首地址的偏… 欢迎关注 轻松拿捏C语言系列来和 小哇 一起进步✊ 感谢大家的阅读、点赞、收藏和关注 希望大家喜欢我本次的讲解 目录
1、写一个宏计算结构体中某变量相对于首地址的偏移并给出说明。考察offsetof宏的实现
2、写一个宏可以将一个整数的二进制位的奇数位和偶数位交换。 1、写一个宏计算结构体中某变量相对于首地址的偏移并给出说明。考察offsetof宏的实现
offsetof宏的原型如下
#include stddef.h
size_t offsetof(type, member);但请注意实际上offset是一个宏而不是一个函数。
它接受两个参数一个结构体类型和一个该类型中的成员名称并返回该成员在结构体中的字节偏移量。
使用举例
#include stdio.h
#include stddef.h typedef struct { int a; char b; double c;
} MyStruct; int main() { printf(%zu\n, offsetof(MyStruct, b)); printf(%zu\n, offsetof(MyStruct, c));return 0;
}
回归题目
我们可以将0转换成一个结构体类型的指针相当于这个结构体的首地址为0所以结构体元素的偏移量就是相对于0的偏移量。
因为首元素地址为0结构体类型指针指向结构体成员的地址将该地址强转成size_t类型就能得到这个偏移量了。
#includestdio.h
struct A
{char a;int b;
};
#define OFFSET1(STRUCTtype,member) (size_t)(((STRUCTtype*)0)-member)//不能用成员指针减结构体起始位置地址的方式去计算偏移量
// #define OFFSET2(STRUCTname,member) (size_t)((STRUCTname.member) - STRUCTname)int main()
{struct A str { a,2024 };printf(%zd\n, OFFSET1(struct A, b));//printf(%zd\n, OFFSET2(str, b));return 0;
} 2、写一个宏可以将一个整数的二进制位的奇数位和偶数位交换。
这里我画了一个图能够更清楚展示 假设是在32位的环境下
将一个整数与01010101……共32位进行按位与运算能够将它二进制的奇数位上的0或1保留下来偶数位上的都变成0
与10101010……32位进行按位与运算能够将它二进制的偶数位上的0或1保留下来奇数位上的都变为0
要想奇数位与偶数位互换可以将保留下奇数位的二进制进行左移最右边补0将保留下偶数位的二进制进行右移最左边补0然后进行按位或运算就能得到交换后的二进制了。 #define Swap(n) (((n(0x55555555))1)|((n(0xaaaaaaaa))1))
int main()
{int n Swap(11);printf(%d\n, n);return 0;
} 本次的内容结束啦希望大家喜欢 能够看懂
希望大家能够三连支持你们的鼓励是我前进的动力
谢谢观看