C++ 为什么是指针+;不允许使用指针,但允许使用指针+;允许整数吗?

C++ 为什么是指针+;不允许使用指针,但允许使用指针+;允许整数吗?,c++,c,pointers,C++,C,Pointers,我正在进行C指针运算。我发现不允许添加指针,但允许pointer+integer 我认为由于安全原因,pointer+pointer是不允许的。但是如果指针说p1保持66400和p2保持66444,该怎么办呢。现在不允许使用p1+p2,但允许使用p1+66444。为什么会这样 指针不是整数。指针算法是这样工作的:如果你有一个指向数组元素a[i]和整数n,那么p+n就是指向a[i+n]的指针。就是这样。当然,可以将指针视为整数,但实际上不应该 指针+整数表示位置+偏移量,这将产生一个新位置。指针+

我正在进行C指针运算。我发现不允许添加指针,但允许
pointer+integer


我认为由于安全原因,
pointer+pointer
是不允许的。但是如果指针说
p1
保持
66400
p2
保持
66444
,该怎么办呢。现在不允许使用
p1+p2
,但允许使用
p1+66444
。为什么会这样

指针不是整数。指针算法是这样工作的:如果你有一个指向数组元素
a[i]
和整数
n
,那么
p+n
就是指向
a[i+n]
的指针。就是这样。

当然,可以将指针视为整数,但实际上不应该

指针+整数表示位置+偏移量,这将产生一个新位置。指针+指针意味着位置+位置,这没有意义

address1 * 2 // Invalid
address1 * address2 // Invalid

在数学方面也是如此,如果这对你有帮助的话。虽然二维向量和二维坐标都可以用类似的方式表示,但只需要添加向量,而不是坐标。

只要从逻辑上考虑一下

如果添加两个指针,结果会是什么?这很可能毫无意义

OTOH,加上整数意味着增加(或减少)指针位置(关于指针类型)。指针是位置,整数是偏移量。逻辑性和有效性

从技术上讲,第§6.5.6章
C11
中的添加
+
运算符也要求

对于加法,两个操作数都应具有算术类型,或者一个操作数应为a 指向完整对象类型的指针,另一个应为整数类型。(递增是 相当于增加1。)

这样想

Address 1: 112, Bakers street
Address 2: 11, Nathan road
为什么
Address1+3
可以,但是
Address1+Address2
不好

(顺便说一句,地址1+3我指的是115号,巴克斯街)

出于同样的原因,将标量或地址与另一个地址相乘也没有意义

address1 * 2 // Invalid
address1 * address2 // Invalid
从逻辑上讲,可能通过加/减的方式从地址中获取偏移量,但加2个地址没有意义,因为相同变量的地址在程序的每次运行中可能不同。此外,加法的类型和值没有任何意义

由于安全原因,我认为不允许使用指针+指针

不,这是不允许的,因为添加指针没有任何意义

如果说
p1
的指针保持
66400
p2
保持
66444
。现在 不允许使用
p1+p2
,但允许使用
p1+66444

你只考虑价值观,也考虑它们的类型。例如,如果
a
保持
2
kg,而
b
保持
3
米,则添加它们是没有意义的


从地址类比中还有一件更重要的事情需要学习:

假设弥敦道上有80所房屋(类似于C中的数组),如果你将
70
添加到
地址2
中,你可能会在房屋、垃圾袋或海里着陆。出于同样的原因,如果超过数组中的地址1,或者在未定义数组行为的前一个地址。如果取消引用数组之外的任何地址,则行为未定义

int NathanRoad[80] = {...};
int *address1 = &NathanRoad[11];
int *q;
int s;
q = address1 + 3; /* OK */
s = *(address1 + 3); /* OK */
q = address1 + 75; /* Bad */
q = address1 + 69; /* OK */
s = *(address1 + 69); /* Bad */

将指针添加到指针是毫无意义的(双关语的意思),它根本没有意义

address1 * 2 // Invalid
address1 * address2 // Invalid
添加指向整数的指针可以得到有用的结果。当然,这取决于使用情况


支持两个指针的减法,因为它可以用于估计大小。有多少元素可以介于两者之间?

哇……否决的原因?yeh mine也被否决了,因为原因。很多答案都被否决了,这是一个很基本的问题。@SurajS AFAIK,一个基本的问题并不是给出答案的标准。但是,我知道什么呢?@SouravGhosh我没有说被否决,因为这是一个基本问题。我问:“即使这是一个基本问题,为什么要投否决票?”。对不起,如果这是错的,那就是答案。总的来说,这是分析事物的合乎逻辑的方法。对于初学者来说,这是一个完美的答案。。!帮助我把概念弄清楚了。谢谢;)@如果没有一群人比我早几十年想到它,我和莫希特贾恩会感到惊讶。
,因为它会导致另一个指针。
。。。到底是怎么回事?我的意思是,你不能在两个指针上执行加法运算,那么你怎么知道结果的类型呢?希望你明白我的意思。:-)@是的,我明白你的意思。我做了一个澄清的编辑,但听起来并不好。也许最好的办法是在
双关语之后省略该部分。只是我的想法。@SouravGhosh完成。:-)指针+指针对你有意义吗?这种方法的实际应用可能是什么?在内存中添加两个对象的地址没有任何应用程序,而指针+整数会给您一个偏移量,这确实很有用。