在函数参数中,*&表示什么?

14

如果我有一个接受 int *& 的函数,那意味着什么?如何将只是一个 int 或指向 int 的指针传递给该函数?

function(int *& mynumber);
无论何时我尝试将指针传递给该函数,它都会显示:
error: no matching function for call to 'function(int *)'
note: candidate is 'function(int *&)'

3
错误是因为我之前提到的“必须是l-value而不仅仅是r-value”的原因。所涉及的规则是“不能将临时值绑定到非const引用”,&“取地址”运算符的结果是一个临时值。 - Flexo
5个回答

24

这是一个指向int类型的指针的引用。这意味着相关函数可以修改指针本身以及指针所指向的int。

您只需传入指针即可,唯一的复杂之处在于指针需要是l-value而不仅仅是r-value,例如:

int myint;
function(&myint);

仅使用 "alone" 并不足够,0/NULL 也是不允许的,而:

int myint;
int *myintptr = &myint;
function(myintptr);

这种情况是可以接受的。当函数返回时,myintptr 很可能不再指向它最初指向的内容。

int *myintptr = NULL;
function(myintptr);

如果函数期望在给定空指针时分配内存,那么这也可能是有意义的。检查提供给函数的文档(或者阅读源代码!),以了解指针的使用预期。


10

简单来说:指针的引用。

C语言中没有引用,传递一个指针的“重定位”的传统方式是传递一个指向指针的指针:

void c_find(int** p, int val); /* *p will point to the node with value 'val' */

在C++中,可以通过引用语法来表达这个概念,避免使用笨拙的双重间接操作。

void cpp_find(int*& p, int val); // p will point to the node with value 'val'

9
这意味着一个指向整数的指针的引用。换句话说,该函数可以更改参数以指向其他内容。
要传入变量,只需传递一个int*。正如awoodland所指出的那样,传入的必须是l-value编辑: 为了建立在awoodland的示例上:
#include <iostream>

void foo(int*& var)
{
    delete var;
    var = new int;
}

int main(int argc, char* argv[])
{
    int* var = NULL;

    std::cout << var << std::endl;

    foo(var);   // this function can/will change the value of the pointer

    std::cout << var << std::endl;

    delete var;

    return 0;
}

+1,左值的好参考,我找不到值得链接的东西。 - Flexo
@awoodland,谢谢。我承认这是我的第一个谷歌搜索结果。我正在寻找更明确的参考资料,但没有找到更好的参考资料。 - luke
如果我理解正确,如果我有一个返回指针的函数,我需要在将其传递给函数之前将其分配给另一个指针吗? - DogDog
@Apoc,我不确定我理解你的问题。 - luke
@Apoc,如果函数只返回int,它就不能绑定到非const引用int。但是可以将其保存到适当的变量中,然后稍后将该变量绑定到引用。 - Flexo

2

function 接受一个参数 mynumber,它是指向 int 的指针的引用。

当需要将指针传递给函数并且该函数可能会更改指针时,这非常有用。例如,如果您的函数实现如下:

function(int*& mynumber)
{
  if( !mynumber )
    mynumber = new int;
  *mynumber = 42;
}

那么在调用代码中可能会出现以下情况:
int main()
{
  int* mynumber = 0;
  function(mynumber); // function will change what "mynumber" points to
  cout << *mynumber;
  return 0;
}

0
这是一个指向 int 的指针的引用 - 你需要传递一个 int 的地址给这个函数,并且要注意函数可能会通过引用改变指针。
愚蠢的例子:
void func(int*& iref) 
{
    iref = new int;
}

int main()
{
    int i(0);
    int* pi(&i);

    func(pi);
    // pi no longer equal to &i

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接