導入
前のレッスンで、変数はメモリ上に「住所(アドレス)」を持つと学びました。ポインタは、その住所を入れておくための変数です。「住所を書いたメモ」だと考えてください。
説明
ポインタを使うには、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;
}
図にすると、ポインタ p は x を「指している」だけの、別の小さな箱です。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 がいつも同じ値を指していることを確かめましょう。&x と p を表示して、同じ番地になっていることも見てください。
演習
int n = 3; を指すポインタ p を作り、*p を使って n の値を 99 に書き換え、n を表示してください(結果は 99)。
ヒント1を見る
int *p = &n; のあと *p = 99;、最後に cout << n << endl;。