指向一个对象的指针和越过不同对象末尾的指针如何能够保存相同地址的示例

问题描述 投票:0回答:1

我正在使用 Stanley 的书 C++ Primer 来学习 C++。特别是当我开始阅读有关指针的内容时,我在书中看到了以下声明:

请注意,指向一个对象的指针和超过另一个对象末尾的指针可以同时保存 相同的地址。


现在我的问题是,有人可以举一些例子来说明上述陈述的含义吗?我的意思是,一些例子将帮助我更好地理解这一点(上述陈述)。我是初学者,所以无法直接理解他们的意思。一个例子肯定会帮助我澄清上述规则/声明。

c++ pointers
1个回答
0
投票

您可以将指向对象的指针加一。即使这不会使指针指向任何地方。例如:

int a = 42;
int* ptr = &a;
++ptr;

现在

ptr
确实指向“过去”
a

两个对象如何在内存中布局取决于实现。通常,在彼此之后定义的对象在内存中彼此相邻。并且以下代码有可能(但不能保证,并且依赖于此的代码必然会中断)两次打印相同的地址:

 int a = 42;
 int b = 42;
 int* ptr_a = &a;
 int* ptr_b = &b;   // address of b
 ++ptr_a;           // one past the address of a
 std::cout << ptr_a << " "  << ptr_b;

但是,如果没有上下文,这句话就不是很有启发性。它只是说两个指针可以保存相同的地址。

当您考虑数组时,这种“过去”的事情会变得更有趣,因为“过去结束指针”通常用于表示数组的结尾。例如,

std::vector
的迭代器可以只是裸指针,并且
end
迭代器指向数组中最后一个元素之后的一个。

© www.soinside.com 2019 - 2024. All rights reserved.