传递双指针和指针作为参数的区别
The difference between passing double pointer and pointer as an argument
- 将 * 作为函数参数传递
#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)
LockFile
函数为this
传递双指针和只传递指针是不一样的
void foo(A* a) {
a = new B();
}
- 将输入指针更改为另一个值。结果不会反映在被调用者
ff()
中。
这只是改变了论点。
void foo(A** a) {
*a = new B();
}
- 将一个指针更改为另一个指针,并将该指针指向的值“另一个指针”更改为。结果将反映在
ff()
根据 ff()
,我假设您有一个后续问题需要在调用 foo()
之后操作 a
。所以第二个可能是一个正确的方法。
对于FileLock
,我相信你指的是这个implementation。
它使用双指针,因为它要替换 FileLock
的全部内容。
跟进:为什么选择使用双指针而不是引用传递?
因为引用不可能被替换,我的假设是它选择了它选择了替换整个内容,这比使实现复杂化以重新初始化更简单。
- 将 * 作为函数参数传递
#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)
LockFile
函数为this
传递双指针和只传递指针是不一样的
void foo(A* a) {
a = new B();
}
- 将输入指针更改为另一个值。结果不会反映在被调用者
ff()
中。 这只是改变了论点。
void foo(A** a) {
*a = new B();
}
- 将一个指针更改为另一个指针,并将该指针指向的值“另一个指针”更改为。结果将反映在
ff()
根据 ff()
,我假设您有一个后续问题需要在调用 foo()
之后操作 a
。所以第二个可能是一个正确的方法。
对于FileLock
,我相信你指的是这个implementation。
它使用双指针,因为它要替换 FileLock
的全部内容。
跟进:为什么选择使用双指针而不是引用传递?
因为引用不可能被替换,我的假设是它选择了它选择了替换整个内容,这比使实现复杂化以重新初始化更简单。