传递双指针和指针作为参数的区别

时间:2021-07-27 05:47:21

标签: c++ pointers leveldb

  1. 将 * 作为函数参数传递
#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);
}
  1. 将**作为函数参数传递
#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

1 个答案:

答案 0 :(得分:1)

传递双指针和只传递一个指针是不一样的

void foo(A* a) {
 a = new B();

}
  1. 将输入指针更改为另一个值。结果不会反映在被调用方 ff() 中。 这只是改变论点。
void foo(A** a) {
 *a = new B();

}
  1. 将一个指针更改为另一个指针并更改此指针指向的值,即“另一个指针”。结果将反映在 ff()

根据ff(),我假设您有一个后续问题,需要在调用a 后操作foo()。所以第二个可能是一个正确的方法。

对于FileLock,我相信您指的是这个implementation

它使用双指针是因为它想替换 FileLock 的全部内容。

Live demo

后续:为什么选择使用双指针而不是通过引用传递?

因为引用是不可能被替换的,我的假设是它选择了替换整个内容,这比使重新初始化的实现复杂化要简单。

相关问题