当前位置: 首页 > 知识库问答 >
问题:

你能对指向另一个对象的char*进行算术吗[重复]

谷梁玺
2023-03-14

这是读取普通可复制对象字节的常见方法

Object obj;
auto p = reinterpret_cast<char*>(&obj);
for(size_t i = 0; i < sizeof(obj); i++)
    consume(p[i]);

问题不在于严格别名,< code>char*可以给任何东西起别名。问题在于[expr.add]中的这段话

当具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。如果表达式P指向具有n元素的数组对象x的元素x[i],则表达式P JJ P(其中J具有值j)指向(可能是假设的)元素x[i j]if0≤i j≤n;否则,行为未定义。同样,表达式P-J指向(可能是假设的)元素x[i−j]if0≤i−j≤n;否则,行为未定义。

其中假设要素是指

为此,指针经过n元素数组xn的最后一个元素时,被视为等同于指向假设元素

也就是说,只有在运算是在指向数组的指针上,并且结果还在它的范围内,才是合法的。

但是,这里显然没有< code > char[sizeof(Object)],我们可以对那个指针做算术吗?

请注意,读取对象字节的合法解决方案是std::memcpy对象。但如果这是唯一的解决方案,那就要问了,如果你几乎不能用它做任何事情,为什么要允许char*混淆现象?

共有1个答案

敖涵容
2023-03-14

根据引号,指针算法应该合法。Objectinstanceobj可以视为 。因此,它是 n元素的数组(请注意, n sizeof(Object))。Standard允许在该数组的边界内加上一个超出该数组边界的假设元素进行指针运算。这是由于 object)]<>

0 ≤ i j ≤ n

表情。

字面上,< code >重新解释_cast

所以,答案是肯定的。

否则数组的< code>std::end将为UB。

 类似资料:
  • 本文向大家介绍Python面向对象实现一个对象调用另一个对象操作示例,包括了Python面向对象实现一个对象调用另一个对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python面向对象实现一个对象调用另一个对象操作。分享给大家供大家参考,具体如下: 我先总结一下python中的类的特点: 1.类中所有的方法的参数中都必须加self,并且是第一个参数 2.__init__方法用

  • 我在3D世界中有两个对象,我想让一个对象面对另一个对象。我已经计算了所有的角度和东西(俯仰角和偏航角)。问题是我没有单独设置偏航或俯仰的函数,这意味着我必须通过四元数来完成。因为我只有一个函数:SetEnetyQuaternion(float x,float y,float z,float w)。这是我的伪代码,我还没有: 我尝试的是从那些与2分开的角度计算窦,但这不起作用——我认为这是针对欧拉角

  • 我目前有一个ArrayList,其中包含“Product”对象,每个对象中包含一个字符串、整数和double。我希望能够使用参数搜索对象,找出与搜索参数匹配的ID(整数值),并将此对象复制到另一个ArrayList中。有没有可能通过迭代器实现这一点,或者有没有更简单的方法?

  • 问题内容: 在课堂上,我有: 除了可以从参数中提供的对象创建bar的副本之外,还可以在构造函数中包含指向bar的指针,以便更改原始bar会更改此对象中的字段吗? 另一种放置方式: 可以进行设置,以便打印y打印9而不是7? 问题答案: 您的最后一个示例以这种方式工作,因为 int 是基元,它是按值复制的。在第一个示例中,“ this.bar ”将保存对 bar 的引用(某种指针)的副本。因此,如果您

  • 我有两个对象列表,它们在两个列表中都有重复名称。我需要从清单2中删除清单1中的所有重复值。 下面是一个场景,类有名称变量,用这个变量需要检查清单1中的重复值并需要删除。 //这是具有3个对象的第一个列表 清单1大小为1 请建议我在Java8与流。

  • 我正在努力找出导致这个问题的原因。我对Java和BlueJ完全陌生,但我已经研究了几个小时,无法找出问题的原因。不断收到错误消息“不兼容类型:泥水匠无法转换为学徒”。非常感谢您的帮助。 //程序的目的:创建一个混合阵列,以容纳两个不同的学徒对象——泥水匠和木匠//泥水匠和木匠//然后将每个对象的所有细节显示在屏幕上。 学徒班就是这样的