如何解决传递双指针和指针作为参数的区别
- 将 * 作为函数参数传递
#include <iostream>
class A {
public:
A() {}
};
class B : public A{
public:
B() {}
};
void foo(A* a) {
a = new B();
}
void ff() {
A a;
foo(&a);
}
- 将**作为函数参数传递
#include <iostream>
class A {
public:
A() {}
};
class B : public A{
public:
B() {}
};
void foo(A** a) {
*a = new B();
}
void ff() {
A* a;
foo(&a);
}
当我看到 leveldb 时,我对此感到困惑。
具体代码如下。
https://github.com/google/leveldb/blob/master/db/db_impl.cc#L1537
我认为可以使用 FileLock lock
然后将 &lock
传递给 LockFile(const std::string& filename,FileLock* lock)
解决方法
传递双指针和只传递一个指针是不一样的
void foo(A* a) {
a = new B();
}
- 将输入指针更改为另一个值。结果不会反映在被调用方
ff()
中。 这只是改变论点。
void foo(A** a) {
*a = new B();
}
- 将一个指针更改为另一个指针并更改此指针指向的值,即“另一个指针”。结果将反映在
ff()
根据ff()
,我假设您有一个后续问题,需要在调用a
后操作foo()
。所以第二个可能是一个正确的方法。
对于FileLock
,我相信您指的是这个implementation。
它使用双指针是因为它想替换 FileLock
的全部内容。
后续:为什么选择使用双指针而不是通过引用传递?
因为引用是不可能被替换的,我的假设是它选择了替换整个内容,这比使重新初始化的实现复杂化要简单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。