在C中获取类对象的地址?

发布于 2024-11-07 02:12:57 字数 275 浏览 0 评论 0原文

假设我有一个如下的C++类:

class Point {
// implementing some operations
}

那么:

Point p1;
Point p2 = p1;

如果我想知道p2的地址,那么我可以使用&p2。但是我怎样才能得到p2存储的地址呢?因为 p2 不是指针,所以我不能只使用 cout << p2;

Suppose I have a C++ class as follows:

class Point {
// implementing some operations
}

Then:

Point p1;
Point p2 = p1;

If I want to know the address of p2, then I can use &p2. But how can I get the address that p2 stores? Because p2 is not a pointer, so I cannot just use cout << p2;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦罢 2024-11-14 02:12:57

以下有什么问题:

cout << &p2;

正如你所说,p2不是一个指针。从概念上讲,它是存储在内存中某处的数据块。 &p2 是该块的地址。当您执行以下操作时:

Point p2 = p1;

...该数据将复制到“标记为”p1 的块。

但是我怎样才能得到p2存储的地址呢?

除非您向 Point 数据结构添加指针成员,否则它不会存储地址。正如你所说,它不是一个指针。

PS hex 流运算符也可能很有用:

cout << hex << &p2 << endl;

What's wrong with the following:

cout << &p2;

As you say, p2 is not a pointer. Conceptually it is a block of data stored somewhere in memory. &p2 is the address of this block. When you do:

Point p2 = p1;

...that data is copied to the block 'labelled' p1.

But how can I get the address that p2 stores?

Unless you add a pointer member to the Point data structure, it doesn't store an address. As you said, it's not a pointer.

P.S. The hex stream operator might be useful too:

cout << hex << &p2 << endl;
握住我的手 2024-11-14 02:12:57

通过这样做,

Point p2 = p1;

您只需将 p2 的值复制到 p1 上(很可能)。记忆是独立的。
如果你这样做了:

Point* p2 = &p1;

那么 p2 将是指向 p1 的指针(打印它的值将为你提供内存块的开始,然后你可以尝试使用 sizeof 来获取块的大小)。

By doing

Point p2 = p1;

you simply copy the values of p2 onto p1 (most likely). The memory is independent.
If you did instead:

Point* p2 = &p1;

then p2 will be a pointer onto p1 (printing its value will give you the begining of the memory block, you could then try the sizeof to get the size of the block).

悲凉≈ 2024-11-14 02:12:57

接受的答案建议使用运算符 & 来获取对象的地址。

从 C++11 开始,如果对象类定义/重载运算符 &,则此解决方案不起作用。

为了获取对象的地址,从 C++11 开始,应使用模板函数 std::addressof()

Point p1;
Point* p2 = std::addressof(p1);

http://www.cplusplus.com/reference/memory/addressof/

The accepted answer proposes the use of operator & to obtain the address of an object.

As of C++11, this solution does not work if the object class defines/overloads operator &.

In order to get the address of an object, from C++11, the template function std::addressof() should be used instead.

Point p1;
Point* p2 = std::addressof(p1);

http://www.cplusplus.com/reference/memory/addressof/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文