地址C:&(号码)

use*_*376 7 c

我不明白这个程序的输出:

int arr[]={1,7,4,2,5,8};
int x=(&(arr[arr[1]-arr[4]])-arr);
printf("%d" ,x);
Run Code Online (Sandbox Code Playgroud)

arr[arr[1]-arr[4]]等于4.这是什么意思&(4)?为什么打印2?

Ry-*_*Ry- 13

arr[1] - arr[4]
Run Code Online (Sandbox Code Playgroud)

这就像看起来一样.7 - 5 = 2,所以让我们用2以下代替:

arr[2]
Run Code Online (Sandbox Code Playgroud)

这也和它看起来一样.4.在&需要它的地址,这将在两个int从阵列,这是的开始偏移S arr.

&(arr[2]) - arr
Run Code Online (Sandbox Code Playgroud)

减去arr,所以你留下的偏移arr[2]距离arr,这是两个int秒.你去吧

这是一个简化的例子.


如果你期望它8,那就是指针运算的方式.将它们都投射到unsigned int:

(unsigned int)&arr[2] - (unsigned int)arr
Run Code Online (Sandbox Code Playgroud)

将产生8,至少当a int是四个字节时.(演示)


hou*_*oft 5

看看minitech的答案,展示如何推断"2"的打印值.

但是,我认为在您的情况下,您只是误解了&运算符的工作原理.是的,arr[arr[1]-arr[4]]是的4,但这并不意味着这样&(arr[arr[1]-arr[4]])&4; 它正在做&(arr[2]); 并且它采取的地址arr[2],而不是价值arr[2],这是4.