在C ++中传递对指针的引用

Passing references to pointers in C++

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

这就是我要做的:

1
2
3
4
5
6
7
8
9
10
11
12
void myfunc(string*& val)
{
    // Do stuff to the string pointer
}

// sometime later
{
    // ...
    string s;
    myfunc(&s);
    // ...
}

我得到这个错误:

cannot convert parameter 1 from 'std::string *' to 'std::string *&'


你expects参考功能的一个实际的字符串的指针显示的电话,不匿名的字符串的指针。因此:

1
2
3
string s;
string* _s = &s;
myfunc(_s);

要编译就好。

然而,这是有用的,如果你intend只读修改你的两通两个指针的功能。如果你intend两个修改的字符串本身不应该使用一个字符串作为参考的suggested的缘故。这是在提醒着它应该是更明显。关于你投诉的编译程序原代码。在你的代码的指针在创造了冰的飞机,修饰,指针将不consequence冰槽,意图是什么。一个参考的想法(vs.(指针),这是一个永远的两个参考点的实际对象。


问题是,你很想把一个临时的参考,而C++不允许除非《冰const参考。

所以你可以做一个或以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}


这两个变化:

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

编辑:

这是所谓的ref-to-pointer你不能通过的临时地址作为一个基准功能。(除非它是const reference)。

虽然,有shown std::string* pS = &s;(两个局部变量的指针),它的使用将是典型的: 当你想要的"两个转变"被调用的函数指针本身,不是对象,它的两个点。例如,一个功能,allocates assigns存储器和存储器的地址块的信息allocated其论点必须采取一个参考两个指针,指针和两个指针:

1
2
3
4
5
6
void myfunc(string*& val)
{
//val is valid even after function call
   val = new std::string("Test");

}

&s产生两个临时的字符串的指针,你不能让两个临时的参考对象。


试试:

1
2
3
4
5
6
7
8
9
10
11
12
void myfunc(string& val)
{
    // Do stuff to the string pointer
}

// sometime later
{
    // ...
    string s;
    myfunc(s);
    // ...
}

1
2
3
4
5
6
7
8
9
10
11
12
void myfunc(string* val)
{
    // Do stuff to the string pointer
}

// sometime later
{
    // ...
    string s;
    myfunc(&s);
    // ...
}


编辑:在experimented鸭发现一些东西,是一位subtler丹瑞的思想。这里的我现在想的是一个准确的答案。

冰不&slvalue,所以你不能创建一个引用类型,除非它的同行参考借鉴const两个冰淇淋。例如,婊子,你不能做

1
string * &r = &s;

但你能做的

1
string * const &r = &s;

如果你把一个功能相似的声明的头,它会工作。

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

有另一个问题,即,temporaries。"冰规则,你可以得到一个参考两个临时const如果它是只读的。所以在这个案例可能会认为这是一个&;是一个临时的,所以必须宣布const原型的功能。从一个实际的观点,使它在这个案例没有差异。(它的或临时的或一个右值。它的方式,在相同的规则applies)。然而,严格的说,我认为它是一个临时的但不是一个右值。我不知道如果有一路之间的区分"双。(也许是简单的定义,全temporaries是右值,和所有非左值是temporaries。在我不安的专家)的标准。

我是说,你的问题也许冰的高水平。为什么你需要一个参考的解决s吗?如果你想要一个参考两个指针s,你需要定义一个指针在AA

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

如果你想要一个s参考指针和两个sstraightforward,做的事。


我刚刚使用了对指针的引用,使删除的二进制树中除根之外的所有指针都是安全的。为了使指针安全,我们只需将其设置为0。我无法使删除树(只保留根)的函数接受对指针的引用,因为我正在使用根(此指针)作为左、右遍历的第一个输入。

1
2
3
4
5
6
7
8
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

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


欢迎使用C++ 11和rValm引用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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引用),它是字符串的地址。

您可以修改指针,没有人会在意。这是右值最初的一个方面。

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


我知道,这两个通的posible REFERENCES部分,在周末做的货,但我不记得是什么语法的代码,为你的两个我的大脑看起来正确的现在。然而,另一个选项是使用指针的指针:

1
Myfunc(String** s)

myfunc("字符串"&;瓦尔"),这使它没有任何意义。"字符串* &;瓦尔"意味着"字符串值",鸭子&;cancels每个其他。终于可以不小心一字符串变量的函数(两个"字符串值")。只有基本的数据类型可以通过两个功能,为其他数据类型需要通作为指针或引用。 你可以拥有它的字符串&;缬氨酸Val或两个字符串A *功能。