我有一份家庭作业,要弄明白这会打印出来:
static const int *f(const int a[], int i) { return &a[i + 2]; }
int a[] = { 1, 2, 3, 4, 5, 6, 7 };
f(a, 1)[1]; //What this will return
我运行程序并获得 5 ,但至少不明白这是如何工作的。
函数f看起来像是指向我的指针,但我不明白下标1在做什么。
有人可以向我解释一下吗?
答案 0 :(得分:3)
问题完全在于指针算术/数组索引(它们彼此相关)。该功能可以让你失望。
该函数返回索引i + 2
处数组元素的地址。您为1
传递了i
,因此您将获得第四个元素的地址(请回想一下,数组索引是从零开始的)。
接下来发生的是您将结果用作数组的新原点,并从中选择第二个元素。第二个元素恰好是5
。
Index : 0 1 2 3 4 5 6
- - - - - - -
Value : 1 2 3 4 5 6 7
^
|
Return value of f(a, 1) is the new origin
答案 1 :(得分:1)
首先我们有常规数组
a[] = 1 , 2 , 3 , 4 , 5 , 6 , 7
original index = 0 , 1 , 2 , 3 , 4 , 5 , 6
当调用f(a,1)
时,指向的元素是
f(a,1) ↓
a[3] = 1 , 2 , 3 , 4 , 5 , 6 , 7
original index = 0 , 1 , 2 , 3 , 4 , 5 , 6
然后地址返回&
。 &a[3]
是a[3]
的地址,因此它返回数字的地址,并且被视为数组,从该确切的地址开始。
f(a,1) = 1 , 2 , 3 , 4 , 5 , 6 , 7
new index = -3 , -2 , -1 , 0 , 1 , 2 , 3
当询问f(a,1)[1]
时,索引0
就是索引3
的位置。
↓
f(a,1)[1] = 1 , 2 , 3 , 4 , 5 , 6 , 7
new index = -3 , -2 , -1 , 0 , 1 , 2 , 3
并返回5
。
答案 2 :(得分:0)
它有点复杂,但函数f()返回第四个元素的地址。函数调用后的下标然后向上移动到第五个元素,即数字5。