如果我有一个函数需要int *&
,这意味着什么?我怎样才能传递一个int或一个指针int到那个函数?函数参数中的*&意味着什么
function(int *& mynumber);
每当我尝试将指针传递给函数,它说:
error: no matching function for call to 'function(int *)'
note: candidate is 'function(int *&)'
如果我有一个函数需要int *&
,这意味着什么?我怎样才能传递一个int或一个指针int到那个函数?函数参数中的*&意味着什么
function(int *& mynumber);
每当我尝试将指针传递给函数,它说:
error: no matching function for call to 'function(int *)'
note: candidate is 'function(int *&)'
这是一个指针的引用为int。这意味着有问题的函数可以修改指针以及int本身。
可以只传递一个指针,一个复杂之处在于指针需要是1-值,而不仅仅是一个r值,因此,例如
int myint;
function(&myint);
单独
是不够的和也不允许0/NULL,其中:
int myint;
int *myintptr = &myint;
function(myintptr);
是可以接受的。当函数返回时,myintptr
很可能不再指向它最初指向的内容。
int *myintptr = NULL;
function(myintptr);
如果函数在给定NULL指针时期望分配内存,也可能有意义。检查随函数提供的文档(或阅读源代码!)以查看指针如何使用。
简单:一个指针引用。
在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'
+1我喜欢你如何用C++ *和* C解释它。 – Audrius 2010-11-15 16:45:09
它意味着一个参照本发明的指向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;
}
这是一个指向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;
}
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;
}
该错误是因为正是我在谈论“它必须是一个l值,而不仅仅是一个r值”。有争议的规则是“你不能将一个临时变量绑定到一个非const引用”上,这个&“address of”操作符的结果是一个临时变量。 – Flexo 2010-11-15 15:29:24