7

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

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

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

4

2 回答 2

13
arr[1] - arr[4]

这就像它看起来一样。7 - 5 = 2,所以让我们将其替换为2

arr[2]

这也是它看起来的样子。4. 获取它的地址,该&地址将是int距离数组开头的两个 s 偏移量,即arr.

&(arr[2]) - arr

减去arr,所以你留下了 from 的偏移量arr[2]arr即两个ints。你去吧。

这是一个简化的示例。


如果您期望它是8,那么,指针算法就是这样。将它们都投射到unsigned int

(unsigned int)&arr[2] - (unsigned int)arr

将 yield 8,至少当 anint是四个字节时。(演示)

于 2012-07-01T19:17:33.523 回答
5

查看 minitech 的答案,了解如何推断“2”的打印值。

但是,我认为在您的情况下,您只是误解了&操作员的工作方式。是的,arr[arr[1]-arr[4]]4,但这并不意味着&(arr[arr[1]-arr[4]])正在做&4;它在做&(arr[2]);它取的是 的地址arr[2],而不是 的值arr[2],即4

于 2012-07-01T19:23:51.727 回答