【问题标题】:increment of pointer to array数组指针的增量
【发布时间】:2017-01-28 18:38:30
【问题描述】:

我试图理解为什么以下 C++ 代码无法编译

int main () {
  int a[10];
  int (*p)[10] = &a;
  int *q = static_cast<int *>(++p);
}

如果不是很明显,我试图做的是使用指针算法找到指向数组末尾的指针。

到目前为止,我的理解是p 具有指向十个整数数组的类型指针,表达式++p 也是如此。通常,我可以将一个 int 数组分配给一个指向 int 类型指针的变量,但这在递增指针 ++p 上失败。

我第一次尝试不使用static_cast,但这也没有用。

【问题讨论】:

  • 你可以把 p 变成 int*: int* p = a; int* q = ++p;
  • @GregKikola 是的,我可以这样做,但这不是我想做的。我认为这两种情况下的指针算法应该是不同的。
  • 哦,我误解了,我没有看到关于希望q 指向数组末尾的注释。在这种情况下,您可以使用int *q = a + 10;。或者,使用 C++11,int* q = std::end(a);(只包括 &lt;iterator&gt;)。
  • 即使你让它工作,下一个看这段代码的人也可能不会理解它。我认为 (a+10) 更清晰。
  • @brianbeuning 我不打算在生产代码中使用它。我只是在玩指针......

标签: c++ arrays pointers pointer-arithmetic


【解决方案1】:

p 具有指向十个整数数组的类型指针

这是正确的。

通常,我可以将整数数组分配给指针类型的变量 到 int

这也是正确的。除了,如果你比较你的两个语句,你应该会看到明显的区别:p 不是一个整数数组,它是一个指向整数数组的指针。因此,差异。

现在,如果你取消引用指向数组的指针,你的结果将是一个类型为数组的表达式(松散地说),并且可以衰减为指针:

int *q = static_cast<int *>(*++p);

【讨论】:

  • 谢谢,有道理。
  • 奇怪的是,如果我打印 pq 我会得到同样的结果。所以数组指针上的指针算术似乎有些奇怪。
  • @SidiousLord pq 是不同的类型,但它们拥有相同的地址,都指向数组末尾之后的元素。 p 指向从该地址开始的 10 个 ints 数组,q 指向同一地址的 int
  • @GregKikola 我发现我的错误。为了得到我想要的,我需要使用*p++ 而不是*++p。那么p 将指向数组的开头,而q 将指向数组的末尾。
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多