为什么除了编程风格之外还使用成语"Reference to pointer"?

Why is idiom "Reference to pointer" used besides programming style?

本文关键字:成语 Reference to pointer 编程 风格 为什么      更新时间:2023-10-16

在访问C++一些库时,我遇到了传递参数的编程风格

void foo(Matrix*& input)

所以我的问题是这个成语有什么作用,引用指针有什么用?

忽略 cv 限定符,Matrix* 和 Matrix* 并提供服务。[我检查代码是由谷歌经验丰富的人在LLVM框架中编写的,因此只是好奇!

const引用任何内容的目的相同:

void foo(T& input) {
    // does something that modifies input
}
T val;
foo(val);
// now val is something else, potentially

指针只是另一种类型。 foo可能需要更改指针的值(而不是它指向的值),因此它通过引用来获取它。

假设你想做一个函数,你给它一个指针变量,它动态分配一个对象,让变量指向它。在这种情况下,您有 2 个选项。你要么做:

void dynamicallyAllocateObject(Object **out)
{
  *out = new Object();
}

void dynamicallyAllocateObject(Object &* out)
{
  out = new Object(); // no need to dereference
}

您不能只让函数接受指针,否则函数将简单地将此指针复制到参数变量,然后将new返回的指针存储到此副本。因此,您将需要一个指针的指针,或对指针的引用!

In 表示作为参数传递给函数的原始指针可以在函数中更改,并且更改应应用于指针。

如果你想改变函数中的对象,你应该通过引用来传递它。指针是一种对象。

考虑一个创建单向链表的示例。

将新节点添加到列表的函数可以如下所示

#include <iostream>
struct Node
{
    int value;
    Node *next;
};
void push_front( Node * &head, int value )
{
    head = new Node { value, head };
}
int main()
{
    Node *head = nullptr;
    std::cout << head << std::endl;
    push_front( head, 10 );
    std::cout << head << std::endl;
    //...
}

由于第一个参数被声明为引用,因此列表的原始头部将在函数中更改。

如果删除引用,则在调用函数后不会更改原始头部。

指针

并不神奇。它们与任何其他数据一样是数据。对指针的引用就像对任何其他数据的引用一样。没有特别的成语。

如果你能填空这句话

类型 X
的引用 可用于 _____

不管 X 是什么,那么你都知道对指针的引用有什么用。