gpt4 book ai didi

c++ - 什么是指针引用?

转载 作者:可可西里 更新时间:2023-11-01 17:21:38 24 4
gpt4 key购买 nike

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

void func(type* &param);

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

最佳答案

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

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

int main() {
int x = 0;
int* y = &x;
func(y);
}

执行结束时,x具有值(value) 1y0 (就像你一样 can see )。

请注意,为了示例,我使用了 0作为一个空指针,但如果您使用的是 C++11,则 should probably use nullptr instead (对于 operaror<< 没有重载 std::ostream)。


可以通过查看以下代码来理解这个概念:

template<class Type> using ptr = Type*;
ptr<int>& x;

std::unique_ptr<int>& x;

在这些示例中,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)

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


And when to use this? Is it advisable to do this?

与所有功能一样,您会在需要时发现它的用处。但一般来说,有些人在释放动态分配的资源后使用它来重置指针(我不推荐这样做,见下文)。

让我们举个例子:

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

int* x = new int(42);
free_my_int(x);

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

但是在 C++11 和 C++14 中,指针的使用非常少,对指针的引用就更少了。大多数用于指针的东西都没有被其他标准构造所取代(例如,参见 std::optional std::unique_ptr std::shared_ptr std::reference_wrapper )。

关于c++ - 什么是指针引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22374524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com