はじめに
C++やC言語のパワフルな機能の一つに「ポインタ」があります。ポインタは、変数が格納されているメモリ上のアドレスを保持するための特殊な変数です。
構造体に対しても、このポインタを利用することができます。「構造体を指すポインタ」を宣言し、既存の構造体変数のアドレスを代入することで、間接的にその構造体を操作できます。これは、特に関数の引数として大きな構造体を効率的に渡す際などに、非常に重要なテクニックとなります。
この記事では、構造体を指すポインタを宣言し、アドレス演算子 &
を使って、既存の構造体変数のアドレスをポインタに設定する基本的な方法を解説します。
構造体のポインタのサンプルコード
このコードは、Book
(本)という構造体の変数 book1
を作成します。次に、Book
型を指すポインタ p_book
を宣言し、book1
のメモリアドレスを代入します。
完成コード
#include <iostream>
#include <string>
// 「本」構造体の定義
struct Book {
std::string title; // タイトル
int price; // 価格
};
int main() {
// 1. 構造体の変数(実体)を作成
Book book1;
book1.title = "C++プログラミング入門";
book1.price = 2800;
// 2. 構造体を指すポインタを宣言
Book* p_book;
// 3. アドレス演算子(&)を使って、book1のアドレスをポインタに代入
p_book = &book1;
// 4. ポインタを通じて、元の構造体の情報を表示
// (ポインタ経由でのメンバアクセスについては次回解説します)
std::cout << "ポインタ p_book が指している本のタイトル: "
<< p_book->title << std::endl;
std::cout << "変数 book1 のメモリアドレス: " << &book1 << std::endl;
std::cout << "ポインタ p_book に格納されているアドレス: " << p_book << std::endl;
return 0;
}
実行結果(アドレス値は環境により異なります)
ポインタ p_book が指している本のタイトル: C++プログラミング入門
変数 book1 のメモリアドレス: 0x7ffc316a7b20
ポインタ p_book に格納されているアドレス: 0x7ffc316a7b20
コードの解説
Book* p_book;
これが、構造体を指すポインタを宣言している部分です。
Book
: ポインタが指し示す先のデータ型がBook
型であることを示します。*
: アスタリスクは、この変数p_book
が、値を直接格納する通常の変数ではなく、アドレスを格納するポインタ変数であることを示します。
重要: この時点では、ポインタ p_book
はどこも指していません(不定のアドレスが入っています)。ポインタを宣言しただけでは、構造体の実体が作られるわけではないことに注意してください。
p_book = &book1;
これが、ポインタと既存の構造体変数を紐付ける核心部分です。
&book1
: アドレス演算子&
は、変数book1
がメモリ上のどこに配置されているかという「アドレス情報」を取得します。p_book = ...
: 取得したbook1
のアドレスを、ポインタ変数p_book
に代入しています。
この操作により、p_book
は book1
の場所を「指し示す」状態になります。p_book
を通じて、book1
の内容を読み書きすることが可能になります(具体的なアクセス方法は次回解説します)。
まとめ
今回は、構造体を指すポインタの宣言と、アドレスの代入について解説しました。
構造体名* ポインタ名;
のように、アスタリスク*
を付けてポインタを宣言する。&
演算子で、既存の構造体変数のメモリアドレスを取得する。ポインタ = &変数;
のように、取得したアドレスをポインタに代入する。
この「アドレスを指し示す」というポインタの基本概念を理解することが、C++やC言語をより深く使いこなすための鍵となります。