为什么不允许指针+指针但允许指针+整数?

时间:2015-07-30 09:12:20

标签: c++ c pointers

我正在经历C指针算术。我发现不允许添加指针,但允许pointer + integer

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

5 个答案:

答案 0 :(得分:10)

这样想。

Address 1: 112, Bakers street
Address 2: 11, Nathan road

为什么Address1 + 3没问题,但Address1 + Address2不好。

(BTW Address1 + 3我的意思是115,Backers street)

出于同样的原因,将标量或地址乘以另一个地址是没有意义的。

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

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

  

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

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

  

如果指针说p1持有66400p2持有66444。现在   <{1}}是不允许的,但允许p1+p2

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

从地址类比中学到一件更重要的事情:

让我们说Nathan路上有80个房子(类似于C中的阵列),如果你将3添加到70,你可能会被放在一个房子,一个垃圾袋里,或者在海里。出于同样的原因,如果在数组行为未定义之前,您在数组或地址中的地址超过1。如果取消引用数组之外的任何地址,则行为未定义。

Address 2

答案 1 :(得分:2)

当然,你可以将指针视为整数,但你真的不应该。

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

同样在数学中,如果这有助于你。虽然2D矢量和2D坐标都可以类似地表达,但只添加矢量而不是坐标才有意义。

答案 2 :(得分:2)

从逻辑上思考。

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

OTOH,添加整数意味着递增(或递减)指针位置(关于指针的类型)。指针是位置整数偏移。逻辑有效。

从技术上讲,添加+运算符,来自C11,章节§6.5.6,也是强制性的,

  

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

答案 3 :(得分:0)

指针不是整数。指针算法的工作方式如下:如果指针p指向数组元素a[i]和整数n,则p + n是指向a[i + n]的指针。就是这样。

答案 4 :(得分:0)

添加指针指针是没有意义的(双关语意思)它只是没有意义。

添加指向整数的指针可以提供有用的结果。根据使用情况而定。

支持减去两个指针,因为它可用于估算大小。中间有多少元素?