本文へスキップ
BecomeCoder

C++コース · 第6章 ポインタとメモリ · レッスン24

ポインタ入門 ― 住所と中身

ブラウザで完結

導入

前のレッスンで、変数メモリ上に「住所(アドレス)」を持つと学びました。ポインタは、その住所を入れておくための変数です。「住所を書いたメモ」だと考えてください。

説明

ポインタを使うには、2つの記号を覚えます。

  • &変数 … その変数の住所を取り出す(アドレス演算子)。
  • *ポインタ … その住所に置かれている中身を読み書きする(間接参照)。
#include <iostream>
using namespace std;

int main() {
    int x = 5;
    int *p = &x;       // p は「x の住所」を持つポインタ
    cout << "x の値   : " << x  << endl;   // 5
    cout << "x の住所 : " << &x << endl;   // 例: 0x... (番地)
    cout << "p の中身 : " << p  << endl;   // &x と同じ番地
    cout << "*p       : " << *p << endl;   // 5(p の指す先の中身)
    *p = 10;           // *p への代入は、その住所にある x を書き換える
    cout << "x = " << x << endl;           // 10
    return 0;
}

図にすると、ポインタ px を「指している」だけの、別の小さな箱です。p の中身は x の住所(番地)で、*p はその矢印をたどった先=x そのものを表します。

flowchart LR
  p["ポインタ p<br/>中身 = 1002(x の番地)"] -->|"*p でたどる"| x["1002番地<br/>x = 5"]

int *p は「int を指すポインタ」という宣言です。p = &x で x の住所を入れ、*p で x の中身にアクセスします。*p = 10; は「p が指している先=x」を書き換えるので、x 自身が 10 になります。

ポインタは「別名でその変数を操作するリモコン」だと考えると分かりやすいです。手元のリモコン(p)が、離れた場所のテレビ(x)を操作するイメージです。

flowchart LR
  A["&x<br/>(x の住所を取り出す)"] --> P["p に住所を保存"]
  P --> B["*p<br/>(住所をたどって中身にアクセス)"] --> X["x を読む/書く"]

やってみよう

*p = 10; の値を変えたり、x を直接書き換えたりして、x*p がいつも同じ値を指していることを確かめましょう。&xp を表示して、同じ番地になっていることも見てください。

演習

int n = 3; を指すポインタ p を作り、*p を使って n の値を 99 に書き換え、n を表示してください(結果は 99)。

ヒント1を見る

int *p = &n; のあと *p = 99;、最後に cout << n << endl;

実際に動かしてみよう

下のエディタにC++を書いて「実行」を押すと、ブラウザ内のインタプリタで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(cin を使う回は「標準入力」欄に値を入れてから実行します)。

C/C++ — ブラウザ内で実行

ブラウザ内でC/C++を動かす学習用インタプリタ(JSCPP)を読み込みます(入門向けのサブセットです)。
スクロールして表示された時点でも自動で読み込まれます。