[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ポインタ変数

pointこの用語のポイント

point変数だよ

point値としてアドレスを入れられるよ

pointポインタ変数を経由して、他の変数の中身を見たり変更したりできるよ

スポンサーリンク

簡単に書くよ

ポインタ変数とは

他の変数のいる場所を覚えておくのが仕事の変数のこと。(ちょっと嘘)
もう少し正確、かつ小難しく書くと

メモリ上のアドレスを値として入れられる変数のこと
です。

image piyo

詳しく書くよ

ついに来てしまいました。
説明するのが面倒くさいから、華麗に見なかった振りをしていた用語「ポインタ変数(ポインタ)」です。
用語リクエストをいただいてしまった以上、覚悟を決めるしかないですね。
頑張って書いていきます。

それではポインタ変数の説明ですが、結論から書くと「メモリ上のアドレスを値として格納できる変数」が「ポインタ変数」です。

……と言われても、よく分かりませんよね。
大丈夫です。
これから徐々に分かっていくはずなので、取りあえず頭の片隅に置いておいてください。

まずは予備知識から見ていきましょう。

突然ですが、変数とは何でしょうか?

答えは、プログラミング言語における「値を入れておく箱」です。
よく分からなければ、値がミカンで変数はミカン箱だと思ってください。

ポインタ変数

さて、このミカン箱ですが、空中に浮いているわけではありません。
どこかに置いてあります。

どこに置いてあるのでしょうか?

答えは、メモリ上です。
メモリの上にデデンッと鎮座しております。
よく分からなければ、メモリは作業机のようなものだと思ってください。
作業机の上にミカン箱が乗っていて、その中にミカンを放り込むことができるのです。

ポインタ変数2

この作業机を上から見ると、マス目で区切られています。
そして、マス目には、それぞれ番号が振られています。
このマス目に振られた番号を、専門用語では「アドレス」と呼びます。

ポインタ変数3

作業机の上にミカン箱を置くときは、このマス目の中に置きます。
それがルールです。
今回は仮に「13」の番号が振ってあるマス目にミカン箱を置いておきます。

ポインタ変数4

ふぅ。
まだ先は長いので、ここで一息つきましょう。
休憩がてら、ここまでの説明をまとめると

・(ミカンを入れておく)ミカン箱は作業机の上に乗せられる
・作業机にはマス目があり、そのマス目には番号が振られている


となります。
この説明を変数やメモリに置き換えると

・(値を格納できる)変数はメモリ上に展開される
・メモリには位置を特定するためのアドレスが振られている


です。

実は、ここまでが予備知識です。
ここから、いよいよポインタ変数の説明に入ります。

今の時点で、ミカンの入ったミカン箱が作業机の「13」のマス目に乗っています。
小難しい言い回しの方が好きな人は「値の入った変数がメモリの13番アドレスに置いてある」と読み替えてください。

これから、もう1個ミカン箱が登場します。
区別するために、今あるミカン箱は「ミカン箱A」と呼ぶことにします。
これから出てくるミカン箱は「ミカン箱P」です。

しつこいようですが、もう一度言います。
現在、ミカン箱Aが作業机の「13」のマス目に乗っています。

さぁ、長らくお待たせしました。
いよいよポインタ変数である「ミカン箱P」の登場です。

ミカン箱Pもミカン箱であることには変わりありません。
ですから、使うときは作業机の上に置きます。
今回は「16」のマス目に置いたとしましょう。

ポインタ変数5

ここまではミカン箱Aもミカン箱Pも同じですね。
それでは、何が違うのでしょう?

違うのは「中に何を入れるか」です。

普通の変数であるミカン箱Aにはミカンが入ります。
ポインタ変数であるミカン箱Pにはミカンは入りません。
代わりに

ミカン箱○は×番のマス目にあるよ

と書いた紙が入ります。
今回の例で言えば、ミカン箱Pには

ミカン箱13番のマス目にあるよ

と書いた紙が入っています。

これが何を意味するかというと、ミカン箱Pの中を覗けば、ミカン箱Aの場所が分かるということです。
つまり、ミカン箱Pの中を覗くことによって、ミカン箱Aにイタズラをすることが可能になります。

だって、ミカン箱Aの場所が分かりますからね。
あとは、そこに行ってイタズラをするだけです。

これは、見方によってはミカン箱Pがミカン箱Aの場所をチクってる……と書くと感じが悪いですね。
ミカン箱Pがミカン箱Aの場所を「指し示している」と言えるでしょう。

ポインタ変数6

このミカン箱Pがポインタ変数です。
ミカンの代わりに作業机のマス目の番号を書いた紙を入れることができるミカン箱です。
ミカンを「値」、作業机を「メモリ」、マス目の番号を「アドレス」、ミカン箱を「変数」と読み替えれば「値としてメモリのアドレスを格納できる変数」となりますね。

少しはイメージが湧きましたでしょうか。

ここまででポインタ変数のイメージが何となく掴めたことを期待して、ポインタ変数の使い方を簡単に説明しておきますね。
例えば以下のような処理があったとします。

変数A = ミカン3個;
ポインタ変数P = 変数Aのアドレス;

変数Aの中身を表示;
ポインタ変数Pの中身を表示;
ポインタ変数Pの指し示す場所の中身を表示;

変数A = ミカン5個;

ポインタ変数Pの指し示す場所の中身を表示;


仮に変数Aのアドレスは「100」だったとしましょう。
この処理を実行すると、以下のような内容が表示されます。

ミカン3個(変数Aの中身)
アドレス「100」(ポインタ変数Pの中身)
ミカン3個(ポインタ変数Pの指し示す場所の中身)

ミカン5個(ポインタ変数Pの指し示す場所の中身)


なんと!
ポインタ変数Pには一切触っていないのにもかかわらず、ポインタ変数Pの指し示す場所の中身が「ミカン3個」から「ミカン5個」変わってしまいました。

……当たり前ですよね?
だって、変数Aの中身を変更したのですから。
ポインタ変数Pの指し示す場所の中身、つまり変数Aの中身が変わっているので、ポインタ変数Pの指し示す場所の中身を表示した際に「ミカン3個」から「ミカン5個」に変わっています。当たり前です。

ところがどっこい、概念をきちんと理解していないと、その当たり前がイメージしにくいのです。
それが、ポインタ関連を難しく感じさせる要因です。

今の説明で例として取り上げた処理をC言語の実際のコードに置き換えると、例えば以下のようになります。

// (1) 変数aに「3」を代入
int a;
a = 3;

// (2) ポインタ変数pに変数aのアドレスを代入
int *p;
p = &a;

// (3) 変数aの中身を表示
printf("%d\n" , a);

// (4) ポインタ変数pの中身を表示
printf("%d\n" , p);

// (5) ポインタ変数pの指し示す場所の中身を表示
printf("%d\n" , *p);

// (6) 変数aに「5」を代入
a = 5;

// (7) ポインタ変数pの指し示す場所の中身を表示
printf("%d\n" , *p);


(5)では「3」が表示されるのに対し、(7)では「5」が表示されます。

今度は如何でしょう?
「なんで『*p』の中身が変わってるの?!」と感じる人も多いのではないでしょうか。
ポインタ変数pには一切触っていないですからね。

でも、これは当たり前なのです。

ポインタ変数pには一切触っていません。
だからポインタ変数pの中身は変わっていません。

ポインタ変数pの中に入っているのは

p = &a;

で代入した「変数aのアドレス」です。
これは最初から最後まで一貫して同じです。変わっていません。

ポインタ変数名の「p」がくっついているので紛らわしいですが「*p」が意味するのは「ポインタ変数pの指し示す場所の中身」です。
つまり変数aの中身を表現しています。

変数aの中身は

// (6) 変数aに「5」を代入
a = 5;


で「3」から「5」に変わりました。
だから(5)では「3」が表示されるのに対し、(7)では「5」が表示されるのです。

ポインタ変数は、動きを丸暗記しようとすると大変です。
理屈をきちんと理解するように頑張った方が、結果として労力が少なくて済みますよ。

ポインタ変数のポイントは

(1)変数である
(2)値として(他の変数の)メモリ上のアドレスを取る
(3)ポインタ変数を経由して、他の変数の中身を見たり変更したりできる


です。
特に(3)の部分を、きちんと理解できるように頑張ってください。
(3)がポインタ変数の存在意義であり、ややこしく感じさせている原因です。

image piyo2

一言でまとめるよ

まぁ「ポインタ変数」って単語が出てきたら「アドレスを値として入れられる変数なんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク