具有指针功能的代码如何工作?

时间:2014-02-24 02:33:25

标签: c

我有一份家庭作业,要弄明白这会打印出来:

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在做什么。

有人可以向我解释一下吗?

3 个答案:

答案 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。