首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++类中做指针计算:这是“合法的”吗?

在c++类中做指针计算:这是“合法的”吗?
EN

Stack Overflow用户
提问于 2009-09-07 17:58:07
回答 6查看 1.8K关注 0票数 1

阿海,海伊,

我想知道这样做是否可以:

代码语言:javascript
复制
class SomeClass
{
   int bar;
};

SomeClass* foo = new SomeClass();
int offset = &(foo->bar) - foo;

SomeClass* another = new SomeClass();
*(another+offset) = 3; // try to set bar to 3

只是好奇,丹·欧

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-09-07 18:10:15

我想,从技术上讲,它可能会成功。

然而,有几个问题。酒吧是私人的。你混合了不同类型的指针(指针算法依赖于指针类型: int* +1和char* +1有不同的结果,因为int和char有不同的大小)。

您是否也考虑过指向成员的指针:

代码语言:javascript
复制
#include <cassert>

struct SomeClass
{
   int bar;
};

int main() {
    int SomeClass::*mem_ptr = &SomeClass::bar;
    SomeClass foo;
    foo.*mem_ptr = 3;
    assert(foo.bar == 3);
}
票数 11
EN

Stack Overflow用户

发布于 2009-09-07 18:11:01

这个想法对于POD类来说是可以的(就像其他人对你的示例代码中的错误所说的一样)。对于非POD类,您不一定只通过对象指针的偏移量来标识成员。例如,如果成员是基类的一部分,或者等效地,如果您希望将偏移量应用于指向派生类的指针,但涉及多个或虚拟继承。

但是,你知道指向成员的指针吗?

代码语言:javascript
复制
struct SomeClass
{
    int bar;
};

// fieldtoset is a pointer-to-member
int SomeClass::*fieldtoset = &SomeClass::bar;

SomeClass* another = new SomeClass();
// syntax works as if "*fieldtoset" is "bar" (the member variable referand)
another->*fieldtoset = 3 // set bar to 3
票数 5
EN

Stack Overflow用户

发布于 2009-09-07 18:04:19

它没有什么问题,但如果你不小心的话,它是非常危险的。

另一方面,您的代码是错误的。(another+offset)的指针类型是什么?它实际上是指向SomeClass的指针,而不是整数,所以至少应该将指针转换为( int *):

代码语言:javascript
复制
 *((int *)(another + offset)) = 3;

偏移量是另一件需要注意的事情,因为它总是以指针所指向的类型为单位。简而言之,当字符int是4字节长时,(int *)指针加1实际上就是加4,所以在计算之前最好将任何指针都转换为( *)。

因此,对于您的示例:

代码语言:javascript
复制
SomeClass* foo = new SomeClass();
int offset = (char *)&(foo->bar) - (char *)foo;

SomeClass* another = new SomeClass();
*((int *)((char *)another+offset)) = 3; // try to set bar to 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1390401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档