C 结构点运算符到底做什么(低级视角)?

2023-12-26

我有一个关于 C 中结构的问题。因此,当您创建结构时,您实际上是在定义内存块的框架。因此,当您创建结构体的实例时,您正在创建一个内存块,以便它能够保存一定数量的元素。

但是,我对点运算符的作用有些困惑。如果我有一个struct Car并有一个名为GasMileage(这是一个int成员),我能够得到的值GasMileage通过做类似的事情,

int x = CarInstance.GasMileage;

但是,我对这个点运算符实际发生的情况感到困惑。点运算符只是充当基地址的偏移量吗?它到底是如何推断出它是一个 int 的呢?

我想我很好奇幕后发生的事情。是否可以参考一下GasMileage通过做其他事情?例如

int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage));
int x = *GasMileage

这只是我很快编造出来的。我努力寻找一个好的解释,但似乎没有什么比将点运算符视为魔法更能解释它了。


当您使用.运算符,编译器将其转换为内部的偏移量struct,基于其前面的字段(和填充)的大小。

例如:

struct Car {
    char model[52];
    int doors;
    int GasMilage;
};

假设一个int是 4 个字节并且没有填充,偏移量model is 0,偏移量doors is 52,以及偏移量GasMilage is 56.

因此,如果您知道该成员的偏移量,则可以像这样获得指向它的指针:

int *GasMileagePointer = (int*)((char *)&carInstance + offsetInBytes(GasMile));

演员阵容char *是必要的,以便指针算术一次进行 1 个字节而不是 1 个字节sizeof(carInstance)一次。然后需要将结果转换为正确的指针类型,在本例中int *

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 结构点运算符到底做什么(低级视角)? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 当视图被推送时,UISearchController 不会被关闭

    我知道这是一篇很长的文章 但这只是我保证的一个问题 设置 我在 UISearchController 中遇到了一些非常奇怪的行为 让我描述一下层次结构 然后我将逐步解释视频中发生的情况 您看到的第一个视图是常规 ViewController
  • 这个 typedef 是什么意思?

    我是 C 新手 这个 typedef 对我来说看起来有点奇怪 有人可以解释它的作用吗 typedef void alpm cb log alpm loglevel t const char va list 它位于头文件中 您可以使用 cde
  • 当 PythonOperator 出现错误“Negsignal.SIGKILL”时,Airflow DAG 失败

    我在 Cloud Composer v1 16 16 上运行 Airflowv1 10 15 我的 DAG 看起来像这样 from datetime import datetime timedelta imports from airflo
  • 在多线程代码中出于性能原因应避免什么?

    我目前正在审查 重构一个多线程应用程序 该应用程序应该是多线程的 以便能够使用所有可用的内核并理论上提供更好 卓越的性能 卓越是更好的商业术语 P 编写多线程应用程序时应该注意哪些事项 我的意思是那些会极大地影响性能的事情 甚至可能达到这样
  • 更改用于 TF 命令行的登录帐户

    当使用TFS 2012的命令行版本时 我们调用 TF exe get Path To Team Project Some Folder recursive 通过命令行提示符的调用 我的命令成功了 我没有为此通话输入任何用户名 密码 我想更改
  • 我正在运行哪个版本的 PostgreSQL?

    我在企业环境中 运行Debian Linux 并且没有自己安装它 我使用 Navicat 或 phpPgAdmin 访问数据库 如果有帮助的话 我也没有对运行数据库的服务器的外壳访问权限 从 PostgreSQL 运行此查询 SELECT
  • RxSwift:BehaviorRelay 代替变量使用

    我是 RxSwift 的新手 正在阅读有关主题的内容 我尝试过Variable主题 这又在控制台中发出警告 DEPRECATED Variable is planned for future deprecation Please consi
  • 有没有更简洁的方法来注册 Qt 自定义事件?

    我需要为 Qt 应用程序创建几个自定义事件类 现在 看起来我需要为每个事件类实现以下事件类型注册代码 class MyEvent public QEvent public MyEvent QEvent registeredType stat
  • AUTH_LOGIN 获取完成后如何调用 AUTH_CHECK?

    我正在调用 HTTP API 以使用返回承诺的 axios 登录 AUTH LOGIN 在 API 调用完成之前 AUTH CHECK 被调用并失败 是否可以仅在 http 调用完成后触发 AUTH CHECK 请在下面找到我的 authp
  • Android:如何使用相同的相机意图拍摄多张照片

    我制作了一个 Android 应用程序 可以一张一张地拍摄照片 存储它们 向用户提供预览等等 所有这些任务都是通过类型意图来完成的ACTION IMAGE CAPTURE 所以 每次用户想要拍照时 他应该点击启动意图的 拍照按钮 等待几秒钟
  • 如何将特定状态按组与R中的ggplot2中的一个标签合并在一起?

    我想绘制美国的电网地图 所以我需要将特定的州合并在一起 我想为这些状态绘制边界 但它不起作用 每组也只有一个标签 这是我的数据 https iastate box com s 12xru62lvmbbkrohsn7b4wwexq11umn7
  • CSS :第一个子选择器 IE7

    我遇到了 IE7 的小问题 我有以下 CSS 代码 但它在 IE7 中不起作用 但是 如果不组合 row class span 和 first child 都可以工作 有没有办法做类似的事情或者让它以某种方式工作 row class spa
  • 我可以在 INSERT 语句中使用别名吗?

    我们可以在 insert into 语法中使用别名吗 以下均无效 INSERT INTO tableblabla AS bla INSERT INTO bla tableblabla INSERT INTO tableblabla bla
  • 使用 Java API 创建简单的 1 行 Spark DataFrame

    在 Scala 中 我可以从内存中的字符串创建单行 DataFrame 如下所示 val stringAsList List buzz val df sqlContext sparkContext parallelize jsonValue
  • Dnx 4.5.1/Dnx Core 5.0 不明确的参考

    在我和其他人的许多项目中 如果我使用属于不同 asp net5 项目的对象 则会弹出不明确的引用错误 有趣的是 它仍然可以编译和工作 但没有智能感知 并且我的代码被红线覆盖 一个例子是我有一个指向我的 MVC 项目的测试项目 当我尝试创建
  • 自定义元素适用于 Safari,但不适用于 Firefox 和 Chrome

    我确信我遗漏了规范中的一些基本内容 但在运行于 Safari 的 Mac 上构建了大量自定义元素后 我发现它们不适用于 Firefox 和 Chrome 我缺少什么
  • GlobalScope、CoroutineScope、lifecycleScope

    我习惯于与AsyncTask由于它的简单性 并且很好地理解它 但Coroutines让我感到困惑 您能简单地向我解释一下以下各项的区别和用途吗 GlobalScope launch Dispatchers IO GlobalScope la
  • VBA多次插入图像,无需复制、粘贴

    这里有一个有点奇怪的问题 在我的一张 Excel 工作表上 我生成了一个 pdf 文档 该代码通过根据需要添加表段并根据需要手动设置分页符来运行 以便表不会分散在单个页面上 大多数表有 5 10 行 在每页的底部 还留有足够的行来插入图像
  • 访问 C 中的命令行参数

    如果这是一个菜鸟问题 请原谅我 但我是 C 的初学者 只学习了一段时间 我尝试编写一个对两个数字求和的程序 作为应用程序的参数提供 代码是这样的 include
  • C 结构点运算符到底做什么(低级视角)?

    我有一个关于 C 中结构的问题 因此 当您创建结构时 您实际上是在定义内存块的框架 因此 当您创建结构体的实例时 您正在创建一个内存块 以便它能够保存一定数量的元素 但是 我对点运算符的作用有些困惑 如果我有一个struct Car并有一个