lisz-works

技術系だけど関係ないこと多い系ブログ

【C言語】ポインタわからない人に贈る「ポインタはお気に入り論」

【スポンサーリンク】

プログラムのソースコード

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」とだけ書くと「登録されたアドレス」が取得できます。

表記が似たり寄ったりで、いざやろうとすると

「なにがなんだっけ?」

と混乱しがちですよね。

なので、はじめのうちは、チートシート(カンペ)を作っておくといいと思います。

↑の表レベルでもいいですし、実際に試したコードと結果を一緒に印刷して見てみたりとか。

ぼくは昔そんなことをしていました(笑)

あとがき

いかがでしたでしょうか?

これでポインタの理解に少しでも役立てれば幸いです……

こういう基礎知識的な感じで書いたので

「で、何が便利なのコレ?」っていう

学校で理科系や数学を勉強してたときと同じような感覚を抱くかもしれません。

でも使いこなすと便利なんです。

なのでひとまず「こうしたら使える」というのを覚えてみてください!