我不明白这个程序的输出:
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?
我不明白这个程序的输出:
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?
arr[1] - arr[4]
这就像它看起来一样。7 - 5 = 2
,所以让我们将其替换为2
:
arr[2]
这也是它看起来的样子。4
. 获取它的地址,该&
地址将是int
距离数组开头的两个 s 偏移量,即arr
.
&(arr[2]) - arr
减去arr
,所以你留下了 from 的偏移量arr[2]
,arr
即两个int
s。你去吧。
如果您期望它是8
,那么,指针算法就是这样。将它们都投射到unsigned int
:
(unsigned int)&arr[2] - (unsigned int)arr
将 yield 8
,至少当 anint
是四个字节时。(演示)
查看 minitech 的答案,了解如何推断“2”的打印值。
但是,我认为在您的情况下,您只是误解了&
操作员的工作方式。是的,arr[arr[1]-arr[4]]
是4
,但这并不意味着&(arr[arr[1]-arr[4]])
正在做&4
;它在做&(arr[2])
;它取的是 的地址arr[2]
,而不是 的值arr[2]
,即4
。