10

この構造を定義するとします。

struct Point {
   double x, y;
};

ここで、このタイプの動的配列を作成するとします。

Point *P = new Point[10];

-番目のポイントの要素にアクセスするためにP[k].xP[k].yの代わりにP[k]->xを使用するのはなぜですか?P[k]->yk

ポインタには後者を使わなければならないと思いました。

4

5 に答える 5

13

実際には、配列内の要素にアクセスするためにp[index].xとを使用します。この場合、動的に割り当てられた配列を参照するためにポインタを使用しているためです。p[index].ystruct

ptr->member演算子は単に。の省略形です(*ptr).member。これを使用するには、左側にポインタが必要です。

Point *p = new Point;
p->x = 12.34;
p->y = 56.78;

動的に割り当てられた配列の場合でも、->演算子は機能することに注意してください。

Point *p = new Point[10];
p->x = 12.34;
p->y = 56.78;

これは同等です

p[0].x = 12.34;
p[0].y = 56.78;

配列へのポインタは、その最初の要素へのポインタと等しいためです。

于 2012-11-20T15:28:31.777 に答える
1

ではなく、オブジェクトを保持する動的に割り当てられた配列を作成したためです。次の方法で各メンバーにアクセスします。PointPoint*operator[]

p[0].x = 42;
于 2012-11-20T15:27:32.547 に答える
1

K番目のポイントの要素にアクセスするためにP[k]->xとP[k]->yの代わりにP[k].xとP[k].yを使用するのはなぜですか?

P[k]はポインタではないため、thの位置にあるオブジェクトでありk、そのタイプはPointであり、ではありませんPoint*。例えば:

Point p = P[0]; // Copy 0th object
p.x; // Access member x
Point* pp = &(P[0]); // Get address of 0th element, equivalent to just P
pp->x; // Access member x
于 2012-11-20T15:30:08.230 に答える
1

一般に、矢印->演算子はポインターの間接参照に使用されます。ただし、この場合、Pはポイントの配列です。Pがポイントポインタの配列である場合、後者を使用することになります

于 2012-11-20T15:30:38.463 に答える
-1

QはC間接参照に関連していると思います

Cでは、配列名はタイプの変数です(配列の/に割り当てられた最初のメモリ位置へのポインタ)

インデックス(、の角括弧表記[n])を指定すると、間接参照になります。

したがって、

PointerA    behaves like   ArrayA
*PointerA   behaves like   ArrayA[]

ポインター型の変数の場合、アスタリスク(*)は、次の目的で使用される間接演算子です。

値にアクセスします(メモリロケーション内に保存されます)


元のQのコード例を考えると、Pがメモリアドレスの場所に割り当てられていると仮定しますADDR-01

PADDR-01内に保存されているものではないことを指します ADDR-01

P[0]存在の1番目と存在の2番目のスルー内 ADDR-01に保存されているものを指しますADDR-168 bytesP[0]x8 bytesP[0]y

P[0]doubleaは8バイトであり、xとyは両方とも次のように定義されているため、ADDR-01からADDR-16(16バイト)を占有します。double

于 2019-03-01T20:02:25.380 に答える