C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のポインタ演算子とは?アドレス演算子(&)と間接参照演算子(*)をわかりやすく解説

C++には、ポインタを操作するための2つの専用演算子が用意されています。それが「アドレス演算子(&)」と「間接参照演算子(*)」です。

まず、ポインタとは何かをおさらいしましょう。ポインタとは、別の変数のメモリアドレスを格納するための変数のことです。「ある変数のアドレスを持つ変数」は、その変数を「指し示している(ポイントしている)」と表現されます。ポインタが指し示す対象は、intやdoubleのような基本データ型だけでなく、オブジェクト、構造体、さらには別のポインタ自身であってもかまいません。

アドレス演算子(&)とは

アドレス演算子「&」は、間接参照演算子「*」の補完的な役割を持つ単項演算子です。オペランドに指定した変数のメモリアドレス(右辺値)を返します。つまり、「この変数はメモリ上のどこに置かれているのか」を知りたいときに使用します。

使い方の例

#include <iostream>
using namespace std;

int main () {
    int var;      // 通常のint型変数
    int *ptr;     // int型へのポインタ
    int val;      // 値を代入するための変数

    var = 3000;
    ptr = &var;   // varのアドレスを取得してptrに代入
    val = *ptr;   // ptrが指す先の値を取得してvalに代入

    cout << "Value of var :" << var << endl;
    cout << "Value of ptr :" << ptr << endl;
    cout << "Value of val :" << val << endl;

    return 0;
}

このコードでは、次の流れで処理が行われています。

  • ptr = &var; … アドレス演算子「&」を使って、変数varのアドレスを取得し、ポインタptrに格納します。
  • val = *ptr; … 間接参照演算子「*」を使って、ポインタptrが指し示すアドレスに格納されている値(3000)を取り出し、変数valに代入します。

実行結果

上記のコードをコンパイルして実行すると、次のような結果が出力されます。

Value of var : 3000
Value of ptr : 0xbff64494
Value of val : 3000

出力を見ると、変数varには3000という値が入り、ptrにはvarのメモリアドレス(例:0xbff64494)が表示されています。そしてvalには、ポインタ経由で取り出した値3000が格納されていることが確認できます。

なお、ptrに表示されるアドレスは実行環境や実行ごとに異なります。これは、OSがプログラムを実行するたびにメモリ上の配置場所を決めるためです。

まとめ

  • &(アドレス演算子):変数のメモリアドレスを取得する単項演算子。
  • *(間接参照演算子):ポインタが指すアドレスに格納された値を取得する単項演算子。
  • 両者は互いに補完関係にあり、「&でアドレスを得て、*でその中身を参照する」というのがC++ポインタ操作の基本パターンです。
  1. C++のsizeof演算子とは?基本構文と使い方を実例付きで解説

    sizeof はC++のキーワードであると同時に、コンパイル時に評価される演算子でもあります。変数やデータ型が必要とするメモリのサイズをバイト単位で取得するために使用され、プログラムの実行時ではなくコンパイルの時点でその値が確定する点が特徴です。sizeof演算子は、int や double などの組み込み型だけでなく、クラス・構造体・共用体などユーザー定義のデータ型に対しても使用できます。sizeofの基本構文sizeof (data type)「data type」の部分には、サイズを調べたいデータ型や変数名を指定します。例えば、char 型のオブジェクトに適用した場合は必ず 1 を返しま

  2. C#のポインターとは?基本概念からunsafeコードでの使い方まで解説

    ポインターとは何かポインター(pointer)とは、別の変数が格納されているメモリ上のアドレス、つまりメモリ位置の直接的なアドレスを値として持つ変数のことです。通常の変数が「データそのもの」を保持するのに対し、ポインターは「データがどこにあるか」という場所の情報を保持します。ポインターの宣言方法ポインターの基本的な構文は次のとおりです。type *var-name;たとえば、double型へのポインターは以下のように宣言します。double *z; /* double型へのポインター */unsafe修飾子とアンマネージコードC#では、安全性を確保するために、ポインター変数はunsafe修飾子