您的位置:首页 > 编程语言 > C语言/C++

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++,如有不对,还望指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐