最近我进行了一次知识检查,其中包含继续让我感到困惑的代码。在这里:
#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
如何与结果交互(无论是返回引用还是我无法分辨的值)。然后在函数的不同主体中如何使用或不使用取消引用/引用运算符。我只是想解开这一切的逻辑,我一直在轴上扭曲。
编辑在一点帮助下,我相信我舔过这个。在下面查看我的答案。
分而治之:
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 个函数只是通过指针算法递增指针
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
在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;
当前保存指向&t[0]
地址的指针的变量a
递增 1,在这种情况下,这会更改指向数组下一个元素的指针&t[1]
。我们现在前往f3()
int *f3(int &a)
此函数的参数将不接受指针,它需要一个int
值来执行&
引用运算符。因此,*
取消引用运算符用于从f2(t)
返回的值。取消引用$t[1]
只会产生元素本身t[1]
可以通过引用int &a
参数传递给f3()
。
return &a + 1;
a
的引用值递增 1,将引用单个整数的内存值向前移动到数组t[2]
中的下一个元素,并将递增的引用值作为指针返回。上f1()
!
int f1(int *a)
此函数返回将打印到屏幕上的整数。指向t[2]
的指针将非常适合 int 指针参数int *a
。
return *a + 1;
return 语句*
取消引用指向t[2]
获取其值的指针。根据上面的数组初始化t[2] = 2
,所以t[2] + 1 == 3
。返回该值,cout
打印3
。
感谢大家的大帮助。