通过指针算法访问“new”创建的单个对象

时间:2014-04-13 18:56:44

标签: c++ pointers

我正在动态创建3个MyClass对象。

MyClass *ptr = new MyClass[3];

我假设ptr是所述对象的第一个实例的地址。我能做到

(*ptr).doStuff();

然而,当我尝试通过

访问第二个对象时
(* (ptr + sizeof(MyClass)) ).doStuff();

它会引发异常。我怎么能得到其他物体?

4 个答案:

答案 0 :(得分:3)

以下是选项(从大多数推荐到最不推荐):

ptr[1].doStuff();
(ptr+1)->doStuff();
(*(ptr+1)).doStuff();
((MyClass*)((char*)ptr+sizeof(MyClass)))->doStuff();
(*(MyClass*)((char*)ptr+sizeof(MyClass))).doStuff();

答案 1 :(得分:2)

有效代码将显示为

(* (ptr + 1) ).doStuff();

这就是所谓的指针算术。你"转移"指向所需元素数量的指针。

答案 2 :(得分:2)

因为将ptr递增1并不是简单地将指针递增1个字节。相反,它将指针移动到指向数组的下一个元素。而不是你的最后一行,你必须写

(* (ptr + 1) ).doStuff();

或:

(ptr+1)->doStuff();

或者,更具可读性,正如评论者所建议的那样:

ptr[1]->doStuff();

答案 3 :(得分:2)

指针算法已经考虑了指针类型的大小。所以你应该加1,而不是sizeof(MyClass)

否则你太过分了。