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

Nit*_*har -1 c c++ pointers

我正在通过C指针算术.我发现不允许添加指针但pointer + integer允许.

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

Moh*_*ain 10

这样想.

Address 1: 112, Bakers street
Address 2: 11, Nathan road
Run Code Online (Sandbox Code Playgroud)

为什么Address1 + 3好,但Address1 + Address2坏.

(顺便说一句,Address1 + 3我的意思是115,Backers street)

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

address1 * 2 // Invalid
address1 * address2 // Invalid
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果一个指针p1持有66400p2持有66444.现在 p1+p2是不被允许但是p1+66444被允许.

你只想到价值观也考虑他们的类型.例如,如果a持有2kg,并且b保持3仪表,则添加它们是没有意义的.


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

让我们说在弥敦道上有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 */
Run Code Online (Sandbox Code Playgroud)

  • 它**是答案.恕我直言,这是分析事物的合理方式. (3认同)