ポインタとは?

ポインタとは、アドレスを格納する変数のことです。

型* 変数名

という形で記載します。
C言語の挫折要因の栄えある第一位らしいですがそんなに恐れる必要はありません。
あくまでも変数です。 まずはサンプルプログラムを見てみましょう。

スポンサーリンク

サンプルプログラム

ソースファイル名:main.c

実行方法

上のソースを書き写し実行してください。
a、b、*b の値の違いに注目してください。

ポインタ演算子、アドレス演算子

まずは見慣れない記載が二つほどありますね。

  1. char *ptr;
  2. ptr = &a;

1で使用している「*」は、ポインタ演算子といいます。
掛け算にも同じ記号を使いますが、それとは全く別の機能です。
変数宣言の時、変数の前につける事で、変数をアドレスを保持する為の型、ポインタ型変数にしてくれます。

2で使用している「&」はアドレス演算子と呼ばれます。
これも変数の前につける記号ですが、こちらは変数宣言の時につけてはいけません。
変数のアドレスをポインタ型変数に代入するときに使用します。

そうは言われても、ポインタって何?アドレスって何?
となりますよね。
まずは、ポインタとアドレスを理解しましょう。

ポインタとは?アドレスとは?

ポインタを理解するためには、アドレスをまず理解する必要があります。
まずは、アドレスから説明していきます。

アドレスとは?

今まで何気なしに変数を宣言して使ってきたのですが、変数は、プログラム内で使っている以上、パソコン上のどこかに保存されているはずです。
では、その変数はどこに保存されているのでしょうか?

答えはメモリです。
パソコンを買うときに、よくメモリは 512M とか 2G とか書かれていますね。
あのメモリです。

メモリはパソコン内の記憶領域ですよね。
→ メモリとは?
そのどこかに変数宣言した変数があるわけです。
サンプルプログラムでは

char a;
char *b;

と、二つの変数を宣言しています。
a は char 型なので、メモリのどこかにこの a と名付けられた 1 バイト領域があります。
同じように b と名付けられた領域もどこかにあります
(※ ポインタは4バイト or 8バイトです)。

この "どこか" にあたるのがアドレスです。
アドレスは日本語で「住所」ですよね。
パソコン上の変数のいる場所、つまり住所を表すのがアドレスになります。

メモリのイメージ

サンプルプログラムを元にアドレスのイメージを作りました。
サンプルプログラムでは、最初に a を 100 で初期化しています。
イメージで言うと、変数 a はメモリ上の2002番地に割り当てられ、その中に 100 が入っています。
注:) 2002という数字はデタラメな数字です

ポインタとは?

では、ポインタとは何なのでしょうか?

今までの変数は、上のイメージ言うと、値の 100 を入れるための変数でした。
しかし、最初に書いたように、ポインタはアドレスを保持する為の変数です。
サンプルプログラムの

char *b;

の b は、ポインタ型の変数ですから、b には、メモリの先頭からの何番目になるかの情報(アドレス)が入ります。
上のイメージでいうなら、2002 を入れるための変数ということです。

ある変数の場所を指す物 → ポイントを指す物

からポインタという名前なのでしょうか・・・?
これはちょっと不明です・・・

ポインタへ値を入れる方法

では、ポインタにアドレスを入れるにはどうしたらよいのでしょうか?
それには少し特殊な書き方をします。

b = &a;

先ほど、「&」はアドレス演算子と書きましたが、名前が示す通り、変数に「&」を付けてポインタ型変数に代入することで、その変数のアドレスをとることができます。

"a の値ではなく、a のアドレスを入れなさい"

という意味になるわけです。
つまり、サンプルプログラムでは b には変数 a のアドレスが入っていることになります。

ポインタを使った代入

ポインタは、アドレスを入れることができる変数と言いましたが、そのアドレスの指す値が何なのかを知る方法はないのでしょうか?
実は、サンプルプログラム上でそれをやっている箇所があります。
それが

c = *b;

の一文です。
ポインタ型変数に「*」を付けて代入することで

b のアドレスに入っている値を、c に入れなさい"

という意味になります。

メモリのイメージ

このイメージを例に考えていきます。
サンプルプログラムでは、まず b に a の変数のアドレスを入れています。
つまり、b には 2002 が入ります。
そして、c に b のアドレスが指す値を入れているので、c には a の値が入ることになります。

ポインタの型の違いは?

サンプルプログラムでは、ポインタを

char *b;

というように、1バイト char 型のポインタとして宣言しています。
これは1バイト変数の先頭アドレスを指すことになり、

c = *b;

とした時に、1バイトの数字を受け取ることになります。
ポインタの宣言を

long *b;

とすれば、4バイト long 型のポインタとして宣言することになり、

c = *b;

とした時に、4バイトの数字を受け取ることができるようになります。

ポインタはとても便利

ポインタはC言語でプログラムを組む時には必須です。
アドレスを介して値を更新するプログラムはとてもよく使います。
最初は難しいかもしれませんが、多くのサンプルを見て、慣れることで難なく使うことができるようになります。
まだ完璧に理解できていなくても構いません。
少しづつ使いながら覚えていくようにしましょう。

スポンサーリンク