最終更新:2026-10-12
C++ 間接参照演算子 *¶
0.はじめに¶
通常、ポインタを操作するときには*を使います。例えば:
このほかに、どんな用途があるでしょうか?
答えはイエスです。例えば、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に変更しています。
3.->*¶
->*はpointer to member of pointerと呼ばれます。これはさらに理解しやすいでしょう。.*と似ていますが、扱うのは**ポインタオブジェクト**のメンバのアドレスです。
対応する例は次のようになります:
より詳しくはcppreference.comを読んでください。
https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members
理解できましたか?この節は以上です~
関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事
- C++ restrict とコンパイル最適化 | C++那些事