1. 指针作为函数参数传递
传递指针会发生拷贝,被拷贝后的指针再指向其他的地址对原指针产生不了任何作用,那我们就应该让原指针与拷贝后的指针指向的依然是同一地址,那么拷贝后的指针再去指向别的区域,原指针也会同样指向该内存。
为了让它们的地址相同,所以要传递二级指针。
比如,下面的代码会输出 内存分配成功!,这个函数就写正确了。
int* getMemory(int** ptr)
{
*ptr = new int;
return *ptr;
}
int main()
{
int* p = nullptr;
getMemory(&p);
if (p == nullptr)
cout << "内存分配失败!" << endl;
else
{
cout << "内存分配成功!" << endl;
delete p;
}
return 0;
}
2. 题解
接下来看看这道题,这是我一开始的代码:
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
TreeNode* dummy = new TreeNode(-1);
TreeNode* p = dummy;
dfs(root, p);
return dummy->right;
}
void dfs(TreeNode* root, TreeNode* p)
{
if (root == nullptr) return;
dfs(root->left, p);
p->right = new TreeNode(root->val);
p = p->right;
dfs(root->right, p);
}
};
在这版代码中,p 指针传递给函数后会发生拷贝,而改变被拷贝的指针无法对 p 指针产生作用。
因此,为了让它们的地址相同,改为传递二级指针:
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
TreeNode* dummy = new TreeNode(-1);
TreeNode* p = dummy;
dfs(root, &p);
return dummy->right;
}
void dfs(TreeNode* root, TreeNode** p)
{
if (root == nullptr) return;
dfs(root->left, p);
(*p)->right = new TreeNode(root->val);
*p = (*p)->right;
dfs(root->right, p);
}
};
可以看到,代码成功运行:
还有一个需要注意的点,成员选择(->)的优先级 大于 解引用(*)的优先级,记得加括号!
特别感谢:
https://blog.csdn.net/weixin_45867382/article/details/120794415
https://blog.csdn.net/weixin_42809675/article/details/125357423