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

时间:2017-03-15 20:38:10

标签: c++ arrays function pointers reference

最近我进行了一项知识检查,其中包含的代码一直让我感到困惑。这是:

#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如何与结果交互(无论是返回引用还是我无法分辨的值)。然后在函数的不同主体内部如何使用或不使用解除引用/引用运算符。我只是试图揭开它的逻辑,我不断绕着轴扭曲。

修改 有点帮助我相信我有这个舔。检查下面的答案。

3 个答案:

答案 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] = 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;

当前保存指向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] + 13