offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)

        前言:在我们学习结构体的时候,我们知道,结构体中的元素不一定是紧密排列的,其中有对其数和偏移量,那么有没有什么方法能直接输出某个元素的偏移量呢?答案是有的,我们只需要使用offsetof宏即可。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

那么我们废话不多说,直接看一下我们将要讲解的知识:

目录

1.什么是offsetof宏

2.offsetof宏的作用和使用

3.offsetof宏的自我实现

        代码讲解:


1.什么是offsetof宏

        宏 offsetof(type, member) 会返回一个类型为 size_t 的整型常量,该常量是一个结构体成员相对于结构体开头的字节偏移量。成员是由 member给定的,结构体的名称是在 type 中给定的。(如下图)

参数:

        type:该参数需要填写一个结构体变量;

        member:该参数填写结构体中的一个元素;

返回值:

        该宏返回类型为 size_t 的值,表示 type 中成员的偏移量。

注:但我们使用offsetof宏时,需要包含#include<stddef.h>头文件

#include<stddef.h>

以上我们就了解了什么是offsetof宏,以及offsetof宏的基本参数。

2.offsetof宏的作用和使用

        由上面的讲解我们可以知道,offsetof宏的作用就是计算结构体中的一个成员相对于结构体开始的偏移量,单位为字节,那么如何去使用offsetof宏呢?

我们直接使用实例:

#include<stdio.h>
#include<stddef.h>
//定义一个结构体
struct S
{char a;int b;char c;short d;
};
int main()
{//offsetof宏的使用size_t ret = offsetof(struct S, b);printf("%zd", ret);return 0;
}

如果不知道结构体的对其数和偏移量的同学,可以浏览----------------------------------------------------->结构体的详解(想要彻底了解结构体,那么看这一篇就够了!)-CSDN博客

这样我们就大致的了解了offsetof宏的作用和基本使用。

3.offsetof宏的自我实现

        理解的offsetof宏的使用,那么我们自己如何自我实现offsetof宏呢?

在自我实现offsetof宏之前,我们看一下visual studio官方是如何实现offsetof宏的:

其实我们自我实现offsetof宏的方式就是图中红色下滑线包括的地方。

直接看一下自我实现宏的代码:

#include<stdio.h>
//自我实现offsetof宏
#define OFFSETOF(type,n) (size_t)&(((type*)0)->n)
//定义一个结构体
struct S
{char a;int b;char c;short d;
};
int main()
{//offsetof宏的使用size_t ret = OFFSETOF(struct S, b);printf("%zd", ret);return 0;
}

        代码讲解:

#define OFFSETOF(type,n) (size_t)&(((type*)0)->n)

注:在重点讲解一下(((type*)0)->n)这个代码:

        1.(type*)0:这是将整型0强制转化为了type类型的指针;由于我们知道,指针变量其实是存放元素地址的变量,例如 指针 int * p = & a (a的地址为0x11223344),其实0x11223344只不过是用十六进制表示的一个数字而已,所以地址也是个数字,那么同理,如果我们将整型0强制转化为了type类型的指针,意思也就是 type 指针 = 0,也就是该指针存放数字为 0 的地址;

        2.((type*)0)->n:我们使用 -> 访问成员 n 的时候,指针向后偏移了 n 成员偏移量个单位,所以偏移之后的地址为 0 + n的偏移量。

之后我们取出地址(也就是 0 + n的偏移量),在强制转化为size_t类型即可得到一个偏移值

这样之后我们就完成了offsetof宏的自我实现。


以上就是offsetof宏的所有内容了~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/586287.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之IP地址证书的重要性

在数字化时代&#xff0c;网络空间已成为各类活动的重要载体&#xff0c;无论是商业交易、信息交流还是远程办公&#xff0c;都离不开互联网的支撑。然而&#xff0c;网络环境的开放性与匿名性也带来了安全风险&#xff0c;如何确保网络交互中的身份真实可信&#xff0c;成为了…

13.Python图形用户界面

我们之前的程序运行结果都被输出到命令提示符&#xff08;终端&#xff09;窗口&#xff0c;界 面比较简陋。本章讲解如何将其输出到图形界面。 1 Python中的图形用户界面开发库 注Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI 程序&#xff0c;也可用于开…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…

探索AI技术创业的三大机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;行业解决方案 方向二&#xff1a;智能产品和服务 方向三&#xff1a;教育和培训 结语 我的其他博客 前言…

vant4的TextEllipsis 文本省略,禁用展开,收起方法

一、需求&#xff1a; 实现多行文本展示&#xff0c;规定大于3行&#xff0c;显示省略号...和查看全部按钮&#xff1b;&#xff08;并且考虑兼容性问题&#xff09; 二、效果图&#xff1a; 三、实现&#xff1a; 如果自己写样式的话&#xff0c;可以对照这个链接实现CSS 实…

C++ vector 动态 向量/数组

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

公司百度百科词条如何修改,五个公司百度百科词条修改技巧全揭秘!

当人们在搜索一个公司的信息时&#xff0c;通常会首先查找该公司的百度百科词条。作为一家公司&#xff0c;其百度百科词条的准确性和全面性对于公司形象的塑造至关重要。因此&#xff0c;如何修改公司的百度百科词条成为一项至关重要的任务。本文洛希爱做百科网将为您介绍公司…

uniapp创建opendb-city-china Schema文件后,如何导入城市的数据?

1.点击opendb-city-china后面的详情&#xff0c;进入到gitee代码仓库 2.下载如下图所示的data.json文件 3.将本地创建的opendb-city-china.schema.json上传到云端 4.点击导入json 如果直接将data.json导入会报错&#xff0c;如下图所示: 5.将data.json本来的数组对象&#…

日历插件fullcalendar【前端】

日历插件fullcalendar【前端】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

Mysql故障解析

目录 一、Mysql单实例故障排查 1.故障一 2.故障二 3.故障三 4.故障四 5.故障五 6.故障六 7.故障七 8.故障八 二、Mysql主从故障排查 1.故障一 2.故障二 3.故障三 三、Mysql优化 1.硬件方面 &#xff08;1&#xff09;关于CPU &#xff08;2&#xff09;关于内…

vue3中mars3d通过滑动条去改变地图图层的透明度

效果图 加滑动条 因为我这个存在单选框&#xff0c;在点击滑动条的时候 会出现将单选框选中的问题&#xff0c;所以用了一个div把滑动条包裹起来并加了冒泡 changeLiveSituationBg方法 // 改变底图显示颜色 val是我点击这个单选框对应值 const changeLiveSituationBg va…

机器学习KNN最邻近分类算法

文章目录 1、KNN算法简介2、KNN算法实现3、调用scikit-learn库中KNN算法4、使用scikit-learn库生成数据集5、自定义函数划分数据集6、使用scikit-learn库划分数据集7、使用scikit-learn库对鸢尾花数据集进行分类 1、KNN算法简介 KNN (K-Nearest Neighbor) 最邻近分类算法&#…