C++函数传指针引用,以及函数返回局部变量
2018-02-09 16:55
363 查看
函数传递指针
问题:传递了Node指针给f()方法,但是在方法内的指针改变,对原指针没有影响。struct Node { int data; }; void f(Node *root) { Node node = {1}; root = &node; std::cout << "f() &root = " << &root << '\n'; if(root != NULL) std::cout << "f() root->data = " << root->data << '\n'; } int main() { Node *root = NULL; f(root); std::cout << "main() &root = " << &root << '\n'; if(root != NULL) std::cout << "main() root->data = " << root->data << '\n'; else std::cout << "root = NULL" << '\n'; return 0; }
以上代码就是我最近遇到问题的示意代码,本以为已经知晓了指针是什么,但似乎还是不熟悉。
我在方法内修改了root指向的内容,回到main方法时,发现root还是NULL。
参考了关于函数参数中有指针无法带出地址以及指针作为函数参数传递时需要注意的问题两篇博客,了解了。
我在传递指针变量给函数时,函数创建了一片新的内存空间作为函数内使用的指针,新指针和原指针指向同一片内存区域,但新指针和原指针是不同地址里面保存的相同的内容。若是我在函数内改变了新指针指向的内存空间,原指针不会发生任何变化。
所以,如果要在函数内得到原指针的引用,而不是让函数再创建一片内存空间来作为原指针副本,就要传递引用,传递指针的引用。
函数传递指针引用
将f()方法改为如下:void f(Node * &root) { Node node = {1}; root = &node; std::cout << "f() &root = " << &root << '\n'; if(root != NULL) std::cout << "f() root->data = " << root->data << '\n'; }
此时遇到新问题,改变过后,发现原指针的确不为NULL了,但是原指针指向的data数值不是函数内的局部变量。
经参考 c++返回函数局部对象的引用 了解局部变量在方法结束后会被回收。
若是使指针指向了局部变量,在方法结束,数据就会丢失。
所以全局结构体指针在方法内需要换个方法来初始化。
结构体指针初始化
void f(Node * &root) { // Node node = {1}; // root = &node; root = (Node *)malloc(sizeof(Node)); root->data = 1; std::cout << "f() &root = " << &root << '\n'; if(root != NULL) std::cout << "f() root->data = " << root->data << '\n'; }
记得引入头文件malloc.h
本人初学C++,如有不对,还望指出。
相关文章推荐
- c++中函数中变量内存分配以及返回指针、引用类型的思考
- c++中函数中变量内存分配以及返回指针、引用类型的思考
- C++不可以返回局部变量的引用或指针
- 如果从函数中返回局部变量的地址,引用或者指针的形式,则变量类型必须是静态的或者常量,即不在栈中存储
- 对引用和指针使用以及函数返回引用和指针类型的理解
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 对引用和指针使用以及函数返回引用和指针类型的理解
- C/C++之函数返回值为指针或者是引用时常见错误总结
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 函数的返回类型可以为值、指针、引用,这三种返回类型有什么不同,各有什么好处?(c++)
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用 (转自effective c++ second edition)
- C++ 中的指针、引用以及函数调用中的问题
- 实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)
- 对引用和指针使用以及函数返回引用和指针类型的理解
- 实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)