C言語で初心者がつまづくで定評のあるポインタについてです。
なんとか解りやすい説明はできないだろうか……
と思い、この記事を書いてみました。
少しでも参考になったらうれしいです。
ポインタとは
ポインタとは……を一応ざっくりと説明しておきます。
ある変数型のアドレスを持つ事が出来る「ポインタ型変数」(以下、ポインタ)というものがあります。
ポインタに、ある変数のアドレスをセットすることで、そのアドレスに対して、データの読み書きを行うことができる変数です。
コチラの例をご覧ください。
#include <stdio.h> int main(void) { int item = 1234; int* pointer; pointer = &item; printf("-- address --\n"); printf("item : 0x%X\n", &item); printf("pointer : 0x%X\n", pointer); /*** 表示結果 **************** -- address -- item : 0x28FF38 pointer : 0x28FF38 ******************************/ printf("-- value --\n"); printf("item : %d\n", item); printf("pointer : %d\n", *pointer); /*** 表示結果 **************** -- value -- item : 1234 pointer : 1234 ******************************/ }
まず、itemという変数のアドレスを、pointerに渡しています。
pointer = &item;
そして、アドレスと値を表示させています。
itemとpointerの結果は同じ値になります。
「お気に入り」機能みたいな感じ
昨今いろいろなアプリやWebサイトなどが使われるのが、もはや当たり前な世界ですよね。
そんな中に、「お気に入り」や「ブックマーク」なんて機能があります。
「これいいな!」
と思ったものを登録しておくと、すぐ見に行けたり、すぐ編集しにいけたり。
ポインタってイメージ的には、これが近いんじゃないかと考えました。
お気に入り登録
「お気に入り機能」を使うには、まず「お気に入り登録」が必要ですよね?
同じように、対象の変数を、ポインタに登録……アドレスをセットします。
コード的にはこうです。
pointer = &item;
先頭に「&」を付けた変数は、「その変数のアドレスを使うよ」ということを示します。
「アドレスアドレスっていうけどアドレスってなんだよ」
という方は、WebサイトのURLとか、PCのフォルダのパス(場所)のようなものと思っておいてください。
ポインタまで進めていれば、なんとなくわかっているかもしれませんが(笑)
ともかく、これでpointerさんは「俺、itemのアドレス知ってるぜ」という状態になりました。
お気に入り先の値を見る
お気に入り登録したからには、使わないとですよね?
「あ、そういえばitemの値知りたいな」
というとき、アドレスを知っているpointerさんは、itemの値を取得することができます。
コードでいうとこの部分。
printf("pointer : %d\n", *pointer);
さっき登録のとき「&」を使いましたね。
こんどは「*」です。
先頭に「*」を付けられたポインタは、「登録されたアドレスの中身(値)を使うよ」ということを示します。
なので、printfや代入のときに、「*ポインタ変数」とすると、登録先の値を表示したり代入したりできます。
pointer先輩は、
「俺、itemのアドレス知ってるからさ、値、取ってこれるぜ?」
という状態なのです。
お気に入り先に値を書き込む
pointerさんは値を取るだけでなく、書き込むこともできてしまいます。
コードでいうとこんな感じ。
*pointer = 9876; printf("pointer : %d\n", *pointer); // pointer : 9876
さっきも出てきた「*」を使います。
先程は「登録されたアドレスの中身(値)を使うよ」という意味として登場しましたね。
「登録されたアドレスの中身(値)」という点がポイントです。
この「中身」に「9876」をセットしています。
まとめ
ではどうやってポインタを扱うかまとめです。
やりたいこと | 書き方 |
---|---|
pointerの登録アドレスに関する操作 | pointer |
pointerの登録先の値に関する操作 | *pointer |
変数自体のアドレスを取得する | &item |
具体的には
やりたいこと | 書き方 |
---|---|
登録がしたい | pointer = &item; |
登録先の値がほしい | *pointer |
登録先の値を変更したい | *pointer = 1; |
登録されたアドレスが知りたい | pointer |
しれっと書きましたが、「pointer」とだけ書くと「登録されたアドレス」が取得できます。
表記が似たり寄ったりで、いざやろうとすると
「なにがなんだっけ?」
と混乱しがちですよね。
なので、はじめのうちは、チートシート(カンペ)を作っておくといいと思います。
↑の表レベルでもいいですし、実際に試したコードと結果を一緒に印刷して見てみたりとか。
ぼくは昔そんなことをしていました(笑)
あとがき
いかがでしたでしょうか?
これでポインタの理解に少しでも役立てれば幸いです……
こういう基礎知識的な感じで書いたので
「で、何が便利なのコレ?」っていう
学校で理科系や数学を勉強してたときと同じような感覚を抱くかもしれません。
でも使いこなすと便利なんです。
なのでひとまず「こうしたら使える」というのを覚えてみてください!