最近我进行了一项知识检查,其中包含的代码一直让我感到困惑。这是:
#include <iostream>
using namespace std;
int f1(int *a) {
return *a + 1;
}
int *f2(int *a) {
return a + 1;
}
int *f3(int &a) {
return &a + 1;
}
int main() {
int t[] = {0, 1, 2, 3};
cout << f1(f3(*f2(t)));
return 0;
}
评估的问题是“该计划的产出是什么?”。通过编译我得到三个。
我知道这显示了处理指针和引用的不同方法,但我无法理解这些逻辑。
有人可以评论此代码的不同行,分解正在处理对t
数组/向量的引用的方法吗?特别是我不明白int *function
如何与结果交互(无论是返回引用还是我无法分辨的值)。然后在函数的不同主体内部如何使用或不使用解除引用/引用运算符。我只是试图揭开它的逻辑,我不断绕着轴扭曲。
修改 有点帮助我相信我有这个舔。检查下面的答案。
答案 0 :(得分:3)
分而治之:
int t[] = {0, 1, 2, 3}; // t is a pointer to the first element of the array
int &a(*f2(t)); // f2(t) returns a pointer, so you need to "dereferencing" using *, to get the referece to the value
int *b = f3(a); //f3(a) take an int by reference and return a pointer to an int
cout << f1(b); //f1(b) take a pointer to an int and returns an int value;
还要注意这两行:
return &a + 1;
和
return *a + 1;
也许没有做你想的事情。
请记住,这3个函数只是通过指针算法递增指针
答案 1 :(得分:0)
在Rama,Ben Voigt和ssell等人的帮助下获得了大量帮助。我相信我能够真正解构这个问题。我希望它能为其他人提供帮助。
从main()开始:
int t[] = {0, 1, 2, 3};
名称为t
的数组填充了四个元素(0,1,2和3)。所以t[0] = 0
,t[1] = 1
,t[2] = 2
和t[3] = 3
。
cout << f1(f3(*f2(t)));
我们想要打印这些嵌套函数的最终结果。他们的调用顺序是f2()
,它将其值返回f3()
,后者将其值返回f1()
,其值以cout
打印。因此从f1()
返回的结果值将决定我们的最终输出。 t
数组作为f2()
的参数提供,没有元素表示对数组的第一个元素的引用,基本上是&t[0]
。现在我们跳转到f2()
开始!
int *f2(int *a)
此函数将返回一种指针int *
。它接受相同类型的实际参数。在这种情况下int *a = &t[0]
,指针a
已设置为t
数组的第一个元素的引用。
return a + 1;
当前保存指向a
地址的指针的变量&t[0]
递增1,在这种情况下,将指针更改为数组的下一个元素&t[1]
。我们现在前往f3()
int *f3(int &a)
此函数的参数不接受指针,需要int
值才能执行&
引用运算符。因此,*
解除引用运算符用于从f2(t)
返回的值。解除引用$t[1]
只会导致元素本身t[1]
,可以通过f3()
参数引用int &a
来传递。
return &a + 1;
a
的引用值加1,将引用的单个整数值的内存向前移动到数组t[2]
中的下一个元素,并返回递增的引用值作为指针。 ON TO f1()
!
int f1(int *a)
此函数返回将打印到屏幕的整数。指向t[2]
的指针很适合int指针参数int *a
。
return *a + 1;
返回语句*
取消引用指向t[2]
获取其值的指针。根据上面t[2] = 2
的数组初始化,t[2] + 1 == 3
。系统会返回该值,cout
会打印3
。
感谢大家的大力帮助。
答案 2 :(得分:0)
f2(t)
是&t[0] + 1
,&t[1]
*(&t[1])
是t[1]
f3(t[1])
是&t[1] + 1
,&t[2]
f1(&t[2])
是t[2] + 1
,3