【问题标题】:Pointers passed by reference? (Sanity check)通过引用传递的指针? (完整性检查)
【发布时间】:2016-04-24 16:04:52
【问题描述】:

我在概念上对在以下情况下看到的内容感到困惑:指针通过引用从 main() 传递到函数 ( func1() )。 func1() 然后进一步通过引用将此指针传递给 func2()。现在如果 func2() 更新指针,使其指向一个新地址,这会反映在 main() 中。

疑问:

1. 是不是在后台某种指针对指针的指针?

2. 当 ptr1 和 ptr2 在 main() 中通过引用传递时, func1() 中的引用 *&ptr1 和 *&ptr2 不是被初始化为 NULL 吗?我读过引用不能初始化为 NULL。

#include <iostream>
using namespace std;

void func2(int *&ptr2)
{
    int var2 = 123;
    ptr2 = &var2;

    cout << endl <<"func2 - ptr2: " << ptr2 << endl;
}

void func1(int *&ptr1, int *&ptr2)
{
    int var1 = 111;
    ptr1 = &var1;
    func2(ptr2);

    cout << endl << "func1 - ptr1: " << ptr1 << "  ptr2: " << ptr2 << endl;
}

int main()
{
    int *ptr1 = NULL;
    int *ptr2 = NULL;
    cout << "main - ptr1: " << ptr1 << "  ptr2: " << ptr2 << endl;

    func1(ptr1, ptr2);
    cout << "main now - ptr1: " << ptr1 << "  ptr2: " << ptr2 << endl;

    return 0;
}

输出:

main - ptr1: 0  ptr2: 0

func2 - ptr2: 0x28fe3c

func1 - ptr1: 0x28fe6c  ptr2: 0x28fe3c
main now - ptr1: 0x28fe6c  ptr2: 0x28fe3c

【问题讨论】:

  • 这就是使用引用的重点。如果您从函数中删除引用 & ,则修改将不可见。事实上, ref 运算符可以被视为省略额外指针的便利。
  • 引用就像它所引用的对象的另一个名称。就像一个别名。
  • 该代码的用途是什么?
  • @perencia 只是为了理解指针和参考:)

标签: c++ pointers pass-by-reference


【解决方案1】:

不,后台没有“指针对指针”?

只有一个指针。

传递一个对象的引用本质上是传递一个指向被引用对象的指针。然后,如果该引用作为第二个引用传递,则将按原样传递相同的实际内部指针。所以第二个函数接收到与第一个函数相同的内部指针。

【讨论】:

  • 这是一直适用还是只适用于函数参数?我想我记得在某处读过一些编译器可能会优化引用变量并在编译期间将其替换为引用变量。不过不确定这是否正确。
  • 这适用于所有引用:int a;诠释 &b=a;整数 &c=b; bc 都是同一个内部指针。这不是某种可选的编译器优化。这是编译 C++ 代码的唯一合理方法。
  • 好的,但我的意思是当编译器在代码中看到bc 时,是否可以通过不使用内部指针(对于'bc)进行优化全部并将出现的bc 替换为a。所以这不是真的吗?我想我读到了这个here
  • 这是真的,当然,在这种情况下。但是,在接收引用作为参数的独立函数中,大多数时候编译器无法推断实际传递的对象是什么,并且必须生成使用引用的代码。
  • 不,引用本身未初始化为 NULL。引用永远不能为空。这些引用被初始化为引用为空的指针。
猜你喜欢
  • 1970-01-01
  • 2014-07-27
  • 2023-03-03
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多