什么是引用指针?

Rei*_*ugh 8 c++ parameter-passing

我最近看到一个被声明为的函数:

void func(type* &param);
Run Code Online (Sandbox Code Playgroud)

我已经知道之间的区别type* paramtype& param.以上与他们有何不同?什么时候使用这个?这样做是否明智?

Sho*_*hoe 15

以上将不仅可以修改指向对象,还可以修改指针本身.例如,请考虑以下代码:

void func(int*& ptr) {
    *ptr = 1;
    ptr = 0;
}

int main() {
    int x = 0;
    int* y = &x;
    func(y);
}
Run Code Online (Sandbox Code Playgroud)

在执行结束时,x具有价值1y0(因为你可以看到).

请注意,对于我使用的例子的目的0空指针,但如果你使用的是C++ 11你或许应该使用nullptr,而不是(这不具有重载operaror<<std::ostream).


通过查看以下代码可以同化这个概念:

template<class Type> using ptr = Type*;
ptr<int>& x;
Run Code Online (Sandbox Code Playgroud)

要么

std::unique_ptr<int>& x;
Run Code Online (Sandbox Code Playgroud)

在这些示例中,x是对类型(ptr<int>然后std::unique_ptr<int>)的引用,它恰好是具有指针语义(operator*operator->)的指针/类.


可以const在指针中的限定符的位置上进行可能有趣的偏离.考虑这两个实例:

  1. void func(const int*& ptr)
  2. void func(int*const& ptr)

它们的含义是:

  1. 指针通过引用常量int.
  2. 指针通过常量引用int.

按照上述类比,ptr它们将是:

  1. ptr<const int>&
  2. ptr<int> const&

因此第一个将无法*ptr = 1在函数体中执行(因为它int是常量),但将很乐意执行ptr = 0.

第二个将反过来行为,允许*ptr = 1(因为指向的int不是常量),而不允许ptr = 0(因为指针是常量).

当然,在以下情况下:

void func(const int*const& ptr)
Run Code Online (Sandbox Code Playgroud)

ptr类比中ptr<const int> const&,两者都不会被允许.


什么时候使用这个?这样做是否明智?

像每个功能一样,当您需要它时,您会发现它的用处.但是,作为一般概念,有些人在释放动态分配的资源后使用它来重置指针(我不推荐这个,见下文).

我们来看这个例子:

free_my_int(int*& ptr) {
    delete ptr;
    ptr = nullptr;
}

int* x = new int(42);
free_my_int(x);
Run Code Online (Sandbox Code Playgroud)

在执行结束时,x将被正确释放并且指针自动设置为nullptr(空指针).这样做是为了防止由于丢失导致的丑陋的分段错误或"已释放的指针未分配"错误消息ptr = nullptr.

但是使用C++ 11和C++ 14时,很少使用指针,甚至更少使用指针.大多数的东西指针,其中用于不与其他标准构建体取代的(参见std::optional,std::unique_ptr,std::shared_ptrstd::reference_wrapper例如).