任何人都可以解释如何添加的逻辑a和b?
#include <stdio.h>
int main()
{
int a=30000, b=20, sum;
char *p;
p = (char *) a;
sum = (int)&p[b]; //adding a and b!
printf("%d",sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
oua*_*uah 20
在+这里隐藏:
&p[b]
Run Code Online (Sandbox Code Playgroud)
这个表达相当于
(p + b)
Run Code Online (Sandbox Code Playgroud)
所以我们实际上有:
(int) &p[b] == (int) ((char *) a)[b]) == (int) ((char *) a + b) == a + b
Run Code Online (Sandbox Code Playgroud)
请注意,这在技术上会调用未定义的行为,因为(char *) a必须指向对象和对象外部的指针算法或者在对象之后调用未定义的行为.
md5*_*md5 10
C标准说E1[E2]相当于*((E1) + (E2)).因此:
&p[b] = &*((p) + (b)) = ((p) + (b)) = ((a) + (b)) = a + b
Run Code Online (Sandbox Code Playgroud)
p[b]是数组的第b个元素p.这就像写作*(p + b).
现在,当添加&它时,就像写作:p + b * sizeof(char)这是p + b.
现在,你必须(int)((char *) a + b)是... a + b.
但是......当你还在+键盘上时,请使用它.
正如@gerijeshchauhan在评论中澄清*并且&是反向操作,他们互相取消.所以&*(p + b)是p + b.