我正在通过C指针算术.我发现不允许添加指针但pointer + integer允许.
pointer + pointer由于安全原因,我认为是不允许的.但是,如果一个指针p1持有66400并p2持有,该怎么办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持有66400并p2持有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)