解压缩C++指针/引用语法

Unpacking C++ pointer/reference syntax

本文关键字:引用 语法 指针 C++ 解压缩      更新时间:2023-10-16

最近我进行了一次知识检查,其中包含继续让我感到困惑的代码。在这里:

#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] + 13

在Rama,Ben Voigt和ssell等人的大力帮助下。我相信我已经能够真正解构这个问题。我希望它能为其他人提供帮助。

以 main () 开头:

int t[] = {0, 1, 2, 3};

名为t的数组填充有四个元素(0、1、2 和 3)。所以t[0] = 0t[1] = 1t[2] = 2t[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

感谢大家的大帮助。