【问题标题】:returning a reference to an array vs a pointer to an array返回对数组的引用与指向数组的指针
【发布时间】:2015-03-17 10:02:54
【问题描述】:

我正在学习 c++,我的教科书(c++ 入门)提出了这个例子:

int odd[] = {1,3,5,7,9};
int even[] = {0,2,4,6,8};
// returns a pointer to an array of five int elements
auto arrPtr(int i) -> int(*)[5]
{ return (i%2) ? &odd : &even;}

并且作为练习要求更改函数以使其返回对数组的引用:

auto arrPtr(int i) -> int(&)[5]
{ return (i%2) ? odd : even;}

我不明白为什么必须返回数组对象才能将其转换为对该数组的引用(如果我正确理解代码的话)。数组的内存地址不应该完全“适合”引用类型吗?

【问题讨论】:

  • 不,参考不是​​地址。它是现有对象的别名。
  • 因为对 T 的引用是使用 T 类型的对象初始化的,而不是指向 T 的指针。
  • 只需添加这个:template <class T> operator T& (T* j) { return *j; }(开玩笑。实际上不要这样做。)
  • 引用不只是一个地址吗?地址不只是一个整数吗?整数不只是一堆位吗?答案是“是的,在一些抽象级别”。 C++ 恰好在不同的抽象级别上运行。
  • int(&)[5] 一个引用类型;它是对 int 类型范围 5 的数组的引用。

标签: c++ arrays pointers reference


【解决方案1】:

我不明白为什么必须返回数组对象才能将其转换为对该数组的引用(如果我正确理解代码的话)。

因为这就是您初始化引用的方式:通过指定它所引用的对象,没有额外的修饰。指针是从其他指针初始化的,这就是为什么您需要& 来获取对象的地址,从而产生一个指针。

数组的内存地址不应该完全“适合”引用类型吗?

是的,引用通常以与指针相同的方式实现。但是为什么这会影响它们的语法呢?它们在概念上是不同的东西(对象的替代名称,而不是包含地址的值),具有不同的语法。

【讨论】:

  • 确切地说:指针不是引用,而只是它(通常)由什么构成(套用 CS Lewis)。
猜你喜欢
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多