通过引用返回指针数组

Posted

技术标签:

【中文标题】通过引用返回指针数组【英文标题】:Return array of pointers by reference 【发布时间】:2017-05-07 20:05:54 【问题描述】:

在我的一门课中,我有一个

Reservation * availability[30] = nullptr;

(当然我稍后会用一些值初始化)。

尽管如此,我有一个 getReservations() 函数,它应该返回对包含 30 个元素的数组的引用,因此可以像这样使用它:

getReservations()[i] ...

我应该如何声明该函数?

【问题讨论】:

旁注:我会亲自使用= ; 初始化数组。看起来您认为所有元素都已初始化为您编写的 nullptr,但它们实际上是值初始化的。 @Quentin 好吧,值初始化和 nullptr 初始化做同样的事情,不是吗?不过我同意,以不同的方式对待第一个元素是愚蠢的。 @user2079303 是的,这就是我的观点。没有功能上的区别,但有点误导。 @Quentin 我的观点是,当它导致相同的结果而没有区别时,真的是 误导 吗?在我看来这很愚蠢。 【参考方案1】:

声明一个通过引用返回数组的函数的语法如下:

Reservation * (& getReservations())[30];

当然,如您所见,您不应该在现实生活中使用它。而是使用类型别名:

using Reservations = Reservation * [30];

Reservations & getReservations();

或者,因为数组没有边界检查,所以只返回一个指针,然后你可以像数组一样索引它:

Reservation * getReservations();

【讨论】:

【参考方案2】:
Reservation *(&getReservations())[30];

应该为你做。

请记住悬空引用和指针管理。

【讨论】:

【参考方案3】:

我建议你使用现代 C++:

using ReservationArray = std::array<Reservation*, 30>;

ReservationArray _availability;

并将其返回为:

ReservationArray& getReservations()

【讨论】:

原始指针在现代 C++ 中仍然难以置信有用。不要将“指针”误认为“拥有动态值”。这些是正交概念。 是的,它们在某些特定情况下很有用。但是为什么你会推荐在这里使用原始指针呢? 您做出了(未经证实的)假设,即这些指针拥有数据。如果他们不拥有,那么unique_ptr 会导致双重删除未定义行为,这是非常非常糟糕的。这些指针很可能是可为空的引用,在这种情况下,Reservation* 是正确的使用方法。

以上是关于通过引用返回指针数组的主要内容,如果未能解决你的问题,请参考以下文章

end — 将数组的内部指针指向最后一个单元

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

返回数组指针或引用。

通过取消引用更改 NSArray 中的值?

函数指针和指针函数和回调函数以及函数指针数组

李连杰的二级指针,二级指针的用途,多级指针的定义使用,数组与指针的区别,void 类型指针,引用