C 这段带有指针函数的代码是如何工作的?

C 这段带有指针函数的代码是如何工作的?,c,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在做什么 有人能给我详细解释一下吗?这有点复杂,但函数f返回第四个元素的

我有一个家庭作业,想知道这会打印出什么:

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


有人能给我详细解释一下吗?

这有点复杂,但函数f返回第四个元素的地址。然后,函数调用后的下标向上移动一到第五个元素,即数字5。

这有点复杂,但函数f返回第四个元素的地址。然后,函数调用后的下标向上移动到第五个元素,即数字5。

问题完全在于指针算术/数组索引,它们彼此相关。这个功能就是要把你扔出去

函数返回索引i+2处数组元素的地址。通过1表示i,就可以得到第四个元素的地址,数组索引是从零开始的

接下来将使用结果作为数组的新原点,并从中拾取第二个元素。第二个元素正好是5


问题完全在于指针算术/数组索引,它们相互关联。这个功能就是要把你扔出去

函数返回索引i+2处数组元素的地址。通过1表示i,就可以得到第四个元素的地址,数组索引是从零开始的

接下来将使用结果作为数组的新原点,并从中拾取第二个元素。第二个元素正好是5


首先是正则数组

a[]            = 1 , 2 , 3 , 4 , 5 , 6 , 7
original index = 0 , 1 , 2 , 3 , 4 , 5 , 6
当调用fa,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
当询问fa,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。

首先我们有一个常规数组

a[]            = 1 , 2 , 3 , 4 , 5 , 6 , 7
original index = 0 , 1 , 2 , 3 , 4 , 5 , 6
当调用fa,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
当询问fa,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。

解释这一点不符合您任务的目的吗?我将投票否决这个问题的所有完整答案。唯一的作弊者是OP,回答者试图提供帮助。@JonathonReinhart家庭作业只要求找到输出;我只是想了解这个函数在将来的测试中是如何工作的。我尝试过搜索,但仍然难以理解这背后的概念,这就是为什么我问这个问题quesiton@WCGPR0显然,这是为了让你明白发生了什么,以便提供正确的答案。你肯定违背了任务的目的。如果我是你的教授,看到你在我的作业中逐字逐句地问这个问题,你会得到零分。@JonathonReinhart幸好你不是。因为你不知道作业的确切规则和措辞是什么。除非你是不太可能的教授,否则解释这一点就不符合你作业的目的吗?我将投票否决这个问题的所有完整答案。唯一的作弊者是OP,回答者试图提供帮助。@JonathonReinhart家庭作业只要求找到输出;我只是想了解这个函数在将来的测试中是如何工作的。我尝试过搜索,但仍然难以理解这背后的概念,这就是为什么我问这个问题quesiton@WCGPR0显然,这是为了让你明白发生了什么,以便提供正确的答案。你肯定违背了任务的目的。如果我是你的教授,看到你在我的作业中逐字逐句地问这个问题,你会得到零分。@JonathonReinhart幸好你不是。因为你不知道作业的确切规则和措辞是什么。除非你是教授,我不太可能是投反对票的白痴之一。就像我在上面的评论中说的。在我看来,提供完整的家庭作业解决方案鼓励作弊。@JonathonReinhart当一个人为别人的硬件作业编写代码时,我同意你的看法。然而,当HW要理解一段故意费解的代码时,对正在发生的事情提供解释并不鼓励作弊,除非答案真的是为教授写的,而不是作为对学生的解释。我是一个投反对票的白痴。就像我在上面的评论中说的。在我看来,提供一个完整的家庭作业解决方案鼓励作弊。@JonathonReinhart我同意你的观点 某人硬件分配的代码。然而,当HW要理解一段故意复杂的代码时,对正在发生的事情进行解释并不鼓励作弊,除非答案确实是为教授编写的,而不是作为对学生的解释。