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

lib*_*bra 5 c++

在C++ Primer的第2章"变量和基本类型"中,它说:

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

我不是母语人士,我认为这就是为什么我对句子"一个指针越过一个对象的结尾"感到有点困惑.有人会告诉我这意味着什么吗?

小智 8

这意味着之后

int a[] = { 1, 2 };
float b;
Run Code Online (Sandbox Code Playgroud)

(void *) &a[2] == (void *) &b可能比较真实.

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

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

  • 形式上,`&a [2]`是未定义的行为.使指针越过结尾的唯一合法方式是"a + 2". (3认同)

Cho*_*ett 8

假设你有一个数组,int foo[5] = {1,2,3,4,5};.它在内存中布局如下:

-----------
|1|2|3|4|5|
-----------
Run Code Online (Sandbox Code Playgroud)

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

-------------
|1|2|3|4|5|?|
-------------
 ^         ^
 |         |
 p         q
Run Code Online (Sandbox Code Playgroud)

p是指向数组的指针; q是一个过去的指针.

现在,假设你也有一个数组const char bar[3] = "Hi";.这两个数组可能在内存中彼此相邻分配,如下所示:

<--foo---> <-bar->
-----------------
|1|2|3|4|5|H|i|0|
-----------------
 ^         ^
 |         |
 p         q
Run Code Online (Sandbox Code Playgroud)

然后q既是一个接一个的结束foo,也指向物理位置bar[0].

  • @libra:`int*pi = foo + 6;`或`int*a =&foo [5],*pi = a + 1;`[关于`int*pi =&foo [6]是否值得商榷; ](http://stackoverflow.com/a/3144917/560648)[合法/定义明确](http://stackoverflow.com/a/988254/560648). (2认同)