指针经过对象末尾是什么意思
what is pointer past the end of an object means?
在C++入门,第2章"变量和基本类型"中,它说:
指向对象的指针和经过不同对象末尾的指针可以保存相同的地址。
我不是母语人士,我认为这就是为什么我对"指针越过物体末端"这句话有点困惑。有人能告诉我这是什么意思吗?
假设你有一个数组,int foo[5] = {1,2,3,4,5};
.它在内存中的布局是这样的:
-----------
|1|2|3|4|5|
-----------
有一个指向数组任何成员的指针是合法的;但是指针指向数组末尾也是合法的(通常在使用迭代器执行 STL 算法时表示它已到达数组的末尾)——尽管取消引用该指针是不合法的。这样:
-------------
|1|2|3|4|5|?|
-------------
^ ^
| |
p q
p
是指向数组的指针; q
是一个指针,一个经过末尾。
现在,假设您还有一个数组const char bar[3] = "Hi";
。这两个数组可能在内存中彼此相邻分配,如下所示:
<--foo---> <-bar->
-----------------
|1|2|3|4|5|H|i|0|
-----------------
^ ^
| |
p q
那么q
既是foo
的"一过",又指向了bar[0]
的物理位置。
这意味着在之后
int a[] = { 1, 2 };
float b;
(void *) &a[2] == (void *) &b
可能会比较为真实。
&a[2]
(或等价地,a+2
)是一个刚过a
末尾的指针,因为数组只包含索引为 0 和 1 的元素。
通常,超出范围的数组索引是完全无效的(不允许访问a[2]
,甚至不允许计算&a[3]
),但是计算刚过数组末尾的地址有一个特殊的例外,因为事实证明,这非常有用,例如在迭代数组时,您需要一个结束值来知道何时停止循环。
"
一个过去"表示"指针上的+1操作"。以下代码生成:
0x7ffffcf6a848
0x7ffffcf6a84c
0x7ffffcf6a84c
如您所见,"一个过去 a"的地址,即 &a + 1
与 &b
相同。
int a = 2;
int b = 3;
cout<< &a << endl << &a + 1 << endl << &b <<endl;
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思