0

下面是一个三重嵌套索引方案。我指向指针数组的指针在注释行上被取消引用......理论上这应该给我一个指针。我从中减去一个,然后引用它并将其重新分配给指向指针数组的指针。但是该行给出了操作数“&”的左值错误。

让我非常清楚。我想知道为什么这里会发生错误,并获得一种方法,该方法可用于将指针数组中前一个元素的地址分配给我的帧双指针。

我只会接受满足这两个标准的完整解决方案....

#include <iostream>

typedef struct frame_s {
  double ** TestArrayPointer;
} frame_t;

main () {

  double * TestArray;
  double ** TestPointerArray;
  TestArray = new double [100];

  TestPointerArray = new double * [100];

  for (unsigned int Counter = 0; Counter<100; Counter++)
  {
     TestArray[Counter]=Counter;
     TestPointerArray[Counter]=&(TestArray[Counter]);
  }

  frame_t Frames[10];
  for (unsigned int Counter = 0; Counter<10; Counter++)
    Frames[Counter].TestArrayPointer = &(TestPointerArray[Counter*10]);

  //Move pointer to point at array position one back.
  Frames[2].TestArrayPointer=
      &(*(Frames[2].TestArrayPointer)-1); //error! here <--

  //OUTPUT Values...
  for (unsigned int Counter = 0; Counter<100; Counter++)
    std::cout << "P: " << TestPointerArray[Counter] << " V: " 
          << *(TestPointerArray[Counter]) << std::endl;

}
4

3 回答 3

1
Frames[2].TestArrayPointer=
  &(*(Frames[2].TestArrayPointer)-1);

在这里,取消引用和取回地址都是不必要的。你可以直接做 -

Frames[2].TestArrayPointer = (Frames[2].TestArrayPointer)-1) ;

但这有一个潜在的问题。

  • 如果索引是 0 怎么办?运行时错误。
  • 如果索引是最后一个索引怎么办?内存泄漏。
于 2011-03-23T23:02:20.617 回答
1

您收到错误是-1因为*. 您不能获取减法运算符的结果的地址 - 这是一个rvalue,而不是一个lvalue(一个 lvalue 指定一个实际的对象 - 一个 rvalue 只是一个短暂的值)。

最初,指向由 指向的数组Frames[2].TestArrayPointer中的第三个。据推测,您希望将其更改为指向该数组中的第二个。如果是这样,您只需将该行更改为:double *TestPointerArraydouble *

Frames[2].TestArrayPointer = Frames[2].TestArrayPointer - 1;
于 2011-03-23T23:04:17.807 回答
0

Frames[2].TestArrayPointer有类型double**

*(Frames[2].TestArrayPointer)有类型double*

*(Frames[2].TestArrayPointer) - 1临时的 type 也是如此double*。临时是一个右值——你不能取它的地址。

我想你想要的是:

&(*((Frames[2].TestArrayPointer)-1))

这也是一个double*,但它是之前的,Frames[2].TestArrayPointer而不是临时的。

如果我们摆脱“取消”运算符和多余的括号:

Frames[2].TestArrayPointer - 1
于 2011-03-23T23:04:38.947 回答