在C ++中传递指针

据我所知,没有理由不允许在C ++中传递对指针的引用。 但是,我这样做的尝试是失败的,我不知道为什么。

这就是我正在做的事情:

void myfunc(string*& val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(&s); // ... } 

我得到这个错误:

不能将参数1从“std :: string *”转换为“std :: string *&'

你的函数期望在调用范围内引用一个实际的string指针,而不是一个匿名的string指针。 从而:

 string s; string* _s = &s; myfunc(_s); 

应该编译得很好。

但是,只有在打算修改传递给函数的指针时才有用。 如果你打算修改string本身,你应该使用Sakebuild议的string引用。 考虑到这一点,为什么编译器会抱怨你原来的代码应该更加明显。 在你的代码中,指针是“即时”创build的,修改指针不会有什么后果,这不是目的。 引用(与指针)的思想是引用总是指向一个实际的对象。

问题是你试图绑定一个临时的引用,C ++不允许,除非引用是const

所以你可以做以下任何一个:

 void myfunc(string*& val) { // Do stuff to the string pointer } void myfunc2(string* const& val) { // Do stuff to the string pointer } int main() // sometime later { // ... string s; string* ps = &s; myfunc( ps); // OK because ps is not a temporary myfunc2( &s); // OK because the parameter is a const& // ... return 0; } 

将其更改为:

  std::string s; std::string* pS = &s; myfunc(pS); 

编辑:

这称为ref-to-pointer ,不能将临时地址作为参考传递给函数。 (除非是const reference )。

虽然,我已经显示std::string* pS = &s; (指向局部variables的指针),其典型用法是:当您希望被调用者更改指针本身时,而不是它指向的对象。 例如,一个分配内存并分配它所分配的内存块的地址的函数必须引用一个指针或一个指向指针的指针:

 void myfunc(string*& val) { //val is valid even after function call val = new std::string("Test"); } 

&s产生临时指针到string,你不能引用临时对象。

尝试:

 void myfunc(string& val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(s); // ... } 

要么

 void myfunc(string* val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(&s); // ... } 

编辑:我试了一些,发现的东西比我想象的有点微妙。 以下是我现在认为的准确答案。

&s不是一个左值,所以你不能创build一个引用,除非引用的types是引用const 。 例如,你不能这样做

 string * &r = &s; 

但你可以做

 string * const &r = &s; 

如果你在函数头里放一个类似的声明,它就会起作用。

 void myfunc(string * const &a) { ... } 

还有一个问题,即临时工。 规则是只有当它是const才能得到临时引用。 所以在这种情况下,人们可能会认为&s是一个临时的,所以必须在函数原型中声明为const 。 从实际的angular度来看,这种情况并没有什么不同。 (无论是右值还是临时值,无论哪种方式,都适用同样的规则。)但严格来说,我认为这不是一个临时值,而是一个右值。 我想知道是否有办法区分这两者。 (也许只是简单地把所有的临时对象都定义为临时值,而所有非临时对象都是临时对象,我不是这个标准的专家)。

这就是说,你的问题可能是在更高的水平。 你为什么要参考s的地址? 如果你想要一个指向s的指针,你需要定义一个指针

 string *p = &s; myfunc(p); 

如果你想引用s或指向s的指针,那就直接做吧。

我刚刚使用了一个指针的引用,使除了根安全以外的二进制树中的所有指针。 为了使指针安全,我们只需要将它设置为0.我不能让删除树(只保留根)的函数接受指针的引用,因为我使用根(this指针)作为第一个input来遍历左右。

 void BinTree::safe_tree(BinTree * &vertex ) { if ( vertex!=0 ) { // base case safe_tree(vertex->left); // left subtree. safe_tree(vertex->right); // right subtree. // delete vertex; // using this delete causes an error, since they were deleted on the fly using inorder_LVR. If inorder_LVR does not perform delete to the nodes, then, use delete vertex; vertex=0; // making a safe pointer } } // end in 

底线,当forms参数是(this)指针时,对指针的引用是无效的。

欢迎来到C ++ 11和右值引用:

 #include <cassert> #include <string> using std::string; void myfunc(string*&& val) { assert(&val); assert(val); assert(val->c_str()); // Do stuff to the string pointer } // sometime later int main () { // ... string s; myfunc(&s); // ... } 

现在你可以访问指针的值(由val引用),它是string的地址。

你可以修改指针,没有人会在意。 这是一个首要的参数。

注意:指针的值只有在myfunc()返回前才有效。 最后,这是一个暂时的。

我知道可以传递指针的引用,上周我做了,但是我不记得语法是什么,因为你的代码现在看起来对我的大脑是正确的。 不过另一种select是使用指针指针:

 Myfunc(String** s) 

myfunc(“string *&val”)本身没有任何意义。 “string *&val”意味着“string val”,*和&取消彼此。 最后,不能将stringvariables传递给函数(“stringval”)。 只有基本的数据types可以传递给一个函数,其他数据types需要作为指针或引用传递。 您可以将string&val或string* val作为函数。