如何设置数组中元素的地址以指向另一个数组中的特定元素?

时间:2014-01-13 07:00:25

标签: c++ arrays memory-address

假设我们有一个包含10个元素的数组,我们想从中提取一个包含前三项和最后三项的6元素子数组。我不希望提取的子数组是一个独立的数组,但我希望它的项指向内存中与原始数组中相应项相同的位置。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您可以使用指针数组指向另一个中的元素:

int a[10] = { 5, 3, 7, 4, 9, 2, 0, 3, 3, 6 };
int* b[6];
b[0] = &a[0];
b[1] = &a[1];

等等。您必须确保a的寿命至少与b一样长。

更惯用的解决方案可能是使用范围类型来保存指向第一个和最后一个感兴趣元素的指针。该范围可以与标准库容器相同的方式进行迭代。例如,请参阅boost.range,或者您可以使用指针作为迭代器推出最小和简单的版本。这将满足您的用例。例如:

struct range
{
  typedef const int* const_iterator;
  const_iterator begin() const {return begin_;}
  const_iterator end() const { return end_; }
  range(const int* begin, const int* end) : begin_(begin), end_(end) {}
  std::size_t size() const {return end_ - begin_ };
private:
  int* begin_;
  int* end_;
};

然后

int a[10] = { 5, 3, 7, 4, 9, 2, 0, 3, 3, 6 };
range b(&a[0], &a[3);
for (range::const_iterator i = b.begin(); i != b.end(); ++i)
  std::cout << *i << " ";
std::cout << std::endl;