我正在使用 Stanley 的书 C++ Primer 来学习 C++。特别是当我开始阅读有关指针的内容时,我在书中看到了以下声明:
请注意,指向一个对象的指针和超过另一个对象末尾的指针可以同时保存 相同的地址。
现在我的问题是,有人可以举一些例子来说明上述陈述的含义吗?我的意思是,一些例子将帮助我更好地理解这一点(上述陈述)。我是初学者,所以无法直接理解他们的意思。一个例子肯定会帮助我澄清上述规则/声明。
您可以将指向对象的指针加一。即使这不会使指针指向任何地方。例如:
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
迭代器指向数组中最后一个元素之后的一个。