0

以下は、トリプル ネストされたインデックス スキームです。ポインターの配列へのポインターは、コメント行で逆参照されます...理論的には、これによりポインターが得られるはずです。そこから 1 を引いて参照し、それをポインタの配列へのポインタに再割り当てします。しかし、その行では、オペランド「&」の左辺値エラーが発生します。

完全に明確にさせてください。ここでエラーが発生している理由を知り、ポインターの配列内の前の要素のアドレスをフレームダブルポインターに割り当てるために機能するメソッドを取得したい。

両方の基準を満たす完全なソリューションのみを受け入れます....

#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が の後に適用されるため、エラーが発生します*。減算演算子の結果のアドレスを取得することはできません。これは、左辺値ではなく右辺値です(左辺値は実際のオブジェクトを指定します。右辺値は単なる一時的な値です)。

最初は、 が指す配列Frames[2].TestArrayPointerの 3 番目を指します。おそらく、代わりにその配列の 2 番目を指すように変更する必要があります。その場合は、その行を次のように変更するだけです。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一時的な with type もそうですdouble*。一時的なものは右辺値です-そのアドレスを取得することはできません。

あなたが望むのは次のとおりだと思います:

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

これも ですが、一時的なものではなくdouble*前のものです。Frames[2].TestArrayPointer

そして、「キャンセル」演算子と冗長な括弧を取り除くと、次のようになります。

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