为什么不允许使用指针+指针,而允许使用指针+整型



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

我认为pointer + pointer是不允许的,因为安全原因。但是如果一个指针说p1保存着66400, p2保存着66444。现在不允许p1+p2,但允许p1+66444。为什么如此?

这样想

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

为什么Address1 + 3是好的而Address1 + Address2是坏的。

(顺便说一句,Address1 + 3我指的是支持者街115号)

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

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

从逻辑上讲,可以通过增加/减少地址来获得偏移量,但增加两个地址没有意义,因为相同变量的地址在每次运行时可能不同。此外,加法的类型和值也没有任何意义。

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

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

如果一个指针说p1保存66400, p2保存66444。现在p1+p2不允许,但p1+66444允许。

你只考虑值,也考虑它们的类型。例如,如果a容纳2 kg, b容纳3 m,则将它们相加是没有意义的。


从地址类比中还可以学到更重要的一点:

假设弥敦道上有80个房子(类似于C中的数组),如果你把70加到Address 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 */

当然,您可以将指针视为整数,但实际上不应该这样做。

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

数学也一样,如果这对你有帮助的话。虽然2D向量和2D坐标都可以用类似的方式表示,但只有将向量相加才有意义,而不是将坐标相加。

从逻辑上考虑。

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

OTOH,增加一个整数意味着增加(或减少)指针的位置(关于指针的类型)。指针是位置整数偏移量

从技术上讲,C11(第6.5.6章)中添加的+操作符也要求,

对于加法,要么两个操作数都为算术类型,要么其中一个操作数为a指针指向一个完整的对象类型,另一个必须是整数类型。(递增相当于加1)

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

添加指针到指针是毫无意义的(双关语),它只是没有意义。

添加指向整型的指针可以得到有用的结果。当然,这取决于用法。

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

最新更新