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++不允许除非《冰
所以你可以做一个或以下:
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); |
编辑:
这是所谓的
虽然,有shown
1 2 3 4 5 6 | void myfunc(string*& val) { //val is valid even after function call val = new std::string("Test"); } |
试试:
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丹瑞的思想。这里的我现在想的是一个准确的答案。
冰不
1 | string * &r = &s; |
但你能做的
1 | string * const &r = &s; |
如果你把一个功能相似的声明的头,它会工作。
1 | void myfunc(string * const &a) { ... } |
有另一个问题,即,temporaries。"冰规则,你可以得到一个参考两个临时
我是说,你的问题也许冰的高水平。为什么你需要一个参考的解决
1 2 | string *p = &s; myfunc(p); |
如果你想要一个
我刚刚使用了对指针的引用,使删除的二进制树中除根之外的所有指针都是安全的。为了使指针安全,我们只需将其设置为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); // ... } |
现在您可以访问指针的值(由
您可以修改指针,没有人会在意。这是右值最初的一个方面。
注意:指针的值只有在
我知道,这两个通的posible REFERENCES部分,在周末做的货,但我不记得是什么语法的代码,为你的两个我的大脑看起来正确的现在。然而,另一个选项是使用指针的指针:
1 | Myfunc(String** s) |
myfunc("字符串"&;瓦尔"),这使它没有任何意义。"字符串* &;瓦尔"意味着"字符串值",鸭子&;cancels每个其他。终于可以不小心一字符串变量的函数(两个"字符串值")。只有基本的数据类型可以通过两个功能,为其他数据类型需要通作为指针或引用。 你可以拥有它的字符串&;缬氨酸Val或两个字符串A *功能。