この構造を定義するとします。
struct Point {
double x, y;
};
ここで、このタイプの動的配列を作成するとします。
Point *P = new Point[10];
-番目のポイントの要素にアクセスするためにP[k].x
とP[k].y
の代わりにP[k]->x
を使用するのはなぜですか?P[k]->y
k
ポインタには後者を使わなければならないと思いました。
この構造を定義するとします。
struct Point {
double x, y;
};
ここで、このタイプの動的配列を作成するとします。
Point *P = new Point[10];
-番目のポイントの要素にアクセスするためにP[k].x
とP[k].y
の代わりにP[k]->x
を使用するのはなぜですか?P[k]->y
k
ポインタには後者を使わなければならないと思いました。
実際には、配列内の要素にアクセスするためにp[index].x
とを使用します。この場合、動的に割り当てられた配列を参照するためにポインタを使用しているためです。p[index].y
struct
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;
配列へのポインタは、その最初の要素へのポインタと等しいためです。
ではなく、オブジェクトを保持する動的に割り当てられた配列を作成したためです。次の方法で各メンバーにアクセスします。Point
Point*
operator[]
p[0].x = 42;
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
一般に、矢印->
演算子はポインターの間接参照に使用されます。ただし、この場合、Pはポイントの配列です。Pがポイントポインタの配列である場合、後者を使用することになります
QはC間接参照に関連していると思います
Cでは、配列名はタイプの変数です(配列の/に割り当てられた最初のメモリ位置へのポインタ)
インデックス(、の角括弧表記[n]
)を指定すると、間接参照になります。
したがって、
PointerA behaves like ArrayA
*PointerA behaves like ArrayA[]
ポインター型の変数の場合、アスタリスク(*)は、次の目的で使用される間接演算子です。
値にアクセスします(メモリロケーション内に保存されます)
元のQのコード例を考えると、Pがメモリアドレスの場所に割り当てられていると仮定しますADDR-01
P
ADDR-01
内に保存されているものではないことを指します ADDR-01
P[0]
存在の1番目と存在の2番目のスルー内 ADDR-01
に保存されているものを指しますADDR-16
8 bytes
P[0]
x
8 bytes
P[0]
y
P[0]
double
aは8バイトであり、xとyは両方とも次のように定義されているため、ADDR-01からADDR-16(16バイト)を占有します。double