当你学习C++时,或者至少当我通过C++ Primer学习它时,指针被称为它们指向的元素的"内存地址".我想知道这是多少.
例如,做两个元素*p1并*p2拥有属性,p2 = p1 + 1或者p1 = p2 + 1 当且仅当它们在物理内存中相邻时?
如果我有两个指针变量a和b,使用语句"a <b"是什么意思?这样做应该比较他们的内存地址的值?如果是这样,计算机中的内存地址顺序是什么?
§6.5.8\ 6(关于>,<,<=,> =)
如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比P大.在所有其他情况下,行为未定义.
上面的几节,§6.5.8,基本上解释了指针算法在数组上的预期工作.那int a[3]; int *p = a; int *q = &a[2]; //q-p == 3是有效的.但是,正如我上面读到的那样q > p是UB.
我错过了什么?
我一直在学习C语言,并跟随Yashavant P. Kanetkar的"Let Us C".
指针章节中有一行说我们只能比较指向同一数组中元素的指针,即小于(<)和大于(>)指针.
为什么比较任意指针无效?
如果你知道两条信息:
然后你逻辑上拥有引用该对象所需的一切:
#include <iostream>
using namespace std;
int main()
{
int x = 1, y = 2;
int* p = (&x) + 1;
if ((long)&y == (long)p)
cout << "p now contains &y\n";
if (*p == y)
cout << "it also dereference to y\n";
}
Run Code Online (Sandbox Code Playgroud)
但是,根据C++标准,这是不合法的.它适用于我尝试过的几个编译器,但它是未定义的行为.
问题是:为什么?