Chu*_*dad 18 c++ math pointers
5.7美元 -
"[..]另外,两个操作数都应具有算术或枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或枚举类型.
2对于减法,以下之一应保持: - 两个操作数都具有算术或枚举类型; 或者 - 两个操作数都是指向同一个完全定义的对象类型的cv-qualified或cv-nonqualified版本的指针; 或 - 左操作数是指向完全定义的对象类型的指针,右操作数具有整数或枚举类型.
int main(){
int buf[10];
int *p1 = &buf[0];
int *p2 = 0;
p1 + p2; // Error
p1 - p2; // OK
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是为什么在C++中不支持'指针添加'但是'指针减法'是?
ten*_*our 18
减法的结果是距离(有用).
添加指针和距离的结果是另一个有意义的指针.
添加2个指针的结果是另一个指针,但这次没有意义.
这与大多数库中存在不同的TimeSpan和DateTime对象的原因相同.
首先想到的是做指针添加没有意义,所以不支持。如果你有2个指针0x45ff23dd, 0x45ff23ed。添加它们是什么意思?一些内存越界。标准委员会中的人还没有找到足够好的理由来支持这样的东西,而是在编译时警告您可能出现的问题。虽然指针减法很好,因为它表示内存距离,这通常很有用。
因为添加两个指针没有意义。
考虑我int在内存中有两个s0x1234和0x1240。这些地址之间的区别是0xc并且是内存中的距离。总和0x2474不对应任何有意义的东西。
但是,您可以添加指向整数的指针以获取另一个指针。这就是在对数组进行索引时所做的事情:p[4] 表示 *(p + 4),这表示“存储在该地址后 4 个单位的地址处的东西”。
通常,您可以通过为每个指针分配值 1 和为每个整数分配值 0 来确定算术运算的“指针性”。如果结果是 1,你就有了一个指针;如果它是 0,你有一个整数;如果它是任何其他值,那么您就有一些没有意义的东西。例子:
/* here p,q,r are pointers, i,j,k are integers */
p + i; /* 1 + 0 == 1 => p+i is a pointer */
p - q; /* 1 - 1 == 0 => p-q is an integer */
p + (q-r); /* 1 + (1-1) == 1 => pointer */
Run Code Online (Sandbox Code Playgroud)