什么是指针超过对象的末尾意味着什么?

时间:2014-02-18 09:58:49

标签: c++

在C ++入门,第2章“变量和基本类型”中,它说:

  

指向对象的指针和指向不同对象末尾的指针可以保存相同的地址。

我不是母语人士,我认为这就是为什么我对“一个指针越过一个对象的指针”这句话感到有些困惑。有人会告诉我这意味着什么吗?

3 个答案:

答案 0 :(得分:8)

这意味着在

之后
int a[] = { 1, 2 };
float b;

(void *) &a[2] == (void *) &b可能会比较为真。

&a[2](或等效地,a+2)是一个刚好超过a末尾的指针,因为该数组只包含索引为0和1的元素。

通常,超出范围的数组索引完全无效(不允许访问a[2],甚至不能计算&a[3]),但是计算刚刚过去的地址有一个特殊的例外。数组的结尾,因为事实证明,这非常有用,例如,当迭代数组并且您需要一个结束值来知道何时停止循环时。

答案 1 :(得分:8)

假设您有一个数组int foo[5] = {1,2,3,4,5};。它在记忆中如下所示:

-----------
|1|2|3|4|5|
-----------

指针指向数组的任何成员是合法的;但是对于指向指向数组结尾的指针也是合法的(通常在使用迭代器执行STL算法时表示它已到达数组的末尾) - 尽管它不是合法取消引用该指针。像这样:

-------------
|1|2|3|4|5|?|
-------------
 ^         ^
 |         |
 p         q

p是指向数组的指针; <{1}}是一个过去的指针。

现在,假设您还有一个数组q。这两个数组可能在内存中彼此相邻分配,如下所示:

const char bar[3] = "Hi";

然后<--foo---> <-bar-> ----------------- |1|2|3|4|5|H|i|0| ----------------- ^ ^ | | p q 既是q的一个过去,也指向foo的实际位置。

答案 2 :(得分:1)

“一个过去”表示“对指针进行+1操作”。以下代码生成:

0x7ffffcf6a848
0x7ffffcf6a84c
0x7ffffcf6a84c

如您所见,“一个过去”的地址,即&a + 1&b相同。

    int a = 2; 
    int b = 3;
    cout<< &a << endl << &a + 1 << endl << &b <<endl;