Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么习语是;引用指针“;除了编程风格之外还使用了什么? 在C++的一些库中,我遇到了传递参数的编程风格。 void foo(Matrix*& input)_C++_Reference - Fatal编程技术网

为什么习语是;引用指针“;除了编程风格之外还使用了什么? 在C++的一些库中,我遇到了传递参数的编程风格。 void foo(Matrix*& input)

为什么习语是;引用指针“;除了编程风格之外还使用了什么? 在C++的一些库中,我遇到了传递参数的编程风格。 void foo(Matrix*& input),c++,reference,C++,Reference,所以我的问题是,这个习语是做什么的,引用指针的目的是什么 忽略cv限定符,矩阵*和矩阵*&服务相同。[我检查过代码是由谷歌有经验的家伙在LLVM框架下编写的,因此很好奇!]与非常量引用任何东西的用途相同: void foo(T& input) { // does something that modifies input } T val; foo(val); // now val is something else, potentially 指针只是另一种类型foo可能需要更

所以我的问题是,这个习语是做什么的,引用指针的目的是什么


忽略cv限定符,矩阵*和矩阵*&服务相同。[我检查过代码是由谷歌有经验的家伙在LLVM框架下编写的,因此很好奇!]

与非
常量
引用任何东西的用途相同:

void foo(T& input) {
    // does something that modifies input
}

T val;
foo(val);
// now val is something else, potentially

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

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;

    //...
}
#包括
结构体类型
{
int值;
节点*下一步;
};
无效推前(节点*&头部,int值)
{
head=新节点{值,head};
}
int main()
{
节点*head=nullptr;

指针并不神奇。它们和其他数据一样都是数据。对指针的引用就像对其他数据的引用一样。没有特殊的习惯用法

如果你能填空这个句子

对类型X的引用
可用于_____


无论X是什么,您都知道对指针的引用有什么好处。

假设您要执行一个函数,向它传递一个指针变量,它动态分配一个对象并让变量指向它。在这种情况下,您有两个选项。您可以:

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


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

查找大量的问题,如何获得指针的头部正确初始化链表实现的一部分。“编程风格”似乎不是这样编写所示函数的好理由。它可以(也可能应该)同样声明为
Matrix*foo(Matrix*)
。然后,作为调用方,我可以决定是否要在适当的位置更改指针(
p=foo(p)
vs
foo(p);
)与否(
auto q=foo(p);
vs
auto q=p;foo(q);
)。@5gon12eder取决于,对吧?如果它像
bool foo(Matrix*&)
?@Barry True,但这是另一个问题。上面显示的函数返回
void
。但即使是
bool foo(Matrix*&)
最好是
Matrix*foo(Matrix*)
(使用
nullptr
作为特殊值)、
可选foo(Matrix*)
std::pair foo(Matrix*)
或任何适用于传达所需语义的内容。“忽略cv限定符,Matrix*和Matrix*&服务相同”不是真的。。
void dynamicallyAllocateObject(Object &* out)
{
  out = new Object(); // no need to dereference
}