我正在经历C指针算术。我发现不允许添加指针,但允许pointer + integer
。
由于安全原因,我认为不允许pointer + pointer
。但是如果指针说p1
持有66400
而p2
持有66444
怎么办?现在不允许p1+p2
,但允许p1+66444
。为什么这样?
答案 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
持有66400
而p2
持有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)
添加指针指针是没有意义的(双关语意思)它只是没有意义。
添加指向整数的指针可以提供有用的结果。根据使用情况而定。
支持减去两个指针,因为它可用于估算大小。中间有多少元素?