コンテンツにスキップ

最終更新:2026-10-12

C++ 間接参照演算子 *

0.はじめに

通常、ポインタを操作するときには*を使います。例えば:

int a = 1;
int *ptr = a;
std::cout << *ptr << std::endl;

このほかに、どんな用途があるでしょうか?

答えはイエスです。例えば、C++には以下の3種類があります:

  • ::*
  • .*
  • ->*

この3つがそれぞれ何を表すか、あなたはわかりますか?

1.::*

::*は**Pointer to member declarator**、すなわちメンバ宣言子へのポインタと呼ばれます。

例を見てみましょう:

下のこの例で、w_のアドレスをどうやって取得すればよいでしょうか?

double * d = &w_;と書いたとすると、それは無効です。w_がどこにあるかわからないためです。そこでメンバ宣言子へのポインタが必要です。これにより束縛を行うことができ、このポインタがあればメンバにアクセスできます。続いて残りの2つを説明します。

class Rectangle {
 public:
  double w_, h_;

  Rectangle(double w, double h) : w_(w), h_(h) {}
  double area() { return w_ * h_; }
};

int main() {
  Rectangle r{2.1, 3.2};
  double Rectangle::* w = &Rectangle::w_;
  r.*w = 2.2;
  std::cout << r.w_ << std::endl;
};

2..*

.*はpointer to member of objectと呼ばれます。これは比較的理解しやすいでしょう。**オブジェクト**のメンバにアクセスするポインタで、メンバへのポインタを使うと、クラスオブジェクトの非静的メンバを参照できます。静的クラスメンバを指すためにメンバへのポインタを使うことはできません。静的メンバのアドレスは特定のオブジェクトとは何の関連もないためです。

そこで上の例にはこの行があり、メンバwの値を2.2に変更しています。

r.*w = 2.2;

3.->*

->*はpointer to member of pointerと呼ばれます。これはさらに理解しやすいでしょう。.*と似ていますが、扱うのは**ポインタオブジェクト**のメンバのアドレスです。

対応する例は次のようになります:

Rectangle r{2.1, 3.2}, *pr;
pr = &r;
std::cout << pr->*w << std::endl;

より詳しくはcppreference.comを読んでください。

https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members

理解できましたか?この節は以上です~

関連トピック

コメント