2010-11-15 104 views
11

如果我有一个函数需要int *&,这意味着什么?我怎样才能传递一个int或一个指针int到那个函数?函数参数中的*&意味着什么

function(int *& mynumber); 

每当我尝试将指针传递给函数,它说:

error: no matching function for call to 'function(int *)' 
note: candidate is 'function(int *&)' 
+3

该错误是因为正是我在谈论“它必须是一个l值,而不仅仅是一个r值”。有争议的规则是“你不能将一个临时变量绑定到一个非const引用”上,这个&“address of”操作符的结果是一个临时变量。 – Flexo 2010-11-15 15:29:24

回答

20

这是一个指针的引用为int。这意味着有问题的函数可以修改指针以及int本身。

可以只传递一个指针,一个复杂之处在于指针需要是1-值,而不仅仅是一个r值,因此,例如

int myint; 
function(&myint); 
单独

是不够的和也不允许0/NULL,其中:

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

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

int *myintptr = NULL; 
function(myintptr); 

如果函数在给定NULL指针时期望分配内存,也可能有意义。检查随函数提供的文档(或阅读源代码!)以查看指针如何使用。

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' 
+3

+1我喜欢你如何用C++ *和* C解释它。 – Audrius 2010-11-15 16:45:09

7

它意味着一个参照本发明的指向int。换句话说,函数可以改变参数来指向别的东西。

要传入一个变量,只需传递一个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; 
} 
+0

+1,对于l值的很好的参考,我找不到任何值得链接的东西。 – Flexo 2010-11-15 15:33:32

+0

@awoodland,谢谢。我承认这是我的第一次谷歌命中。我正在寻找更明确的东西,但没有找到更好的参考。 – luke 2010-11-15 15:35:28

+0

如果我理解得很好,如果我有一个函数返回一个指针,我需要将它分配给另一个指针,然后将它传递给函数? – DogDog 2010-11-15 15:46:07

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; 
} 
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; 
} 
相关问题