ポインタに代入する書き方

ポインタは、変数であるため、値を代入することができます。 ポインタに代入をする時は、

ポインタ = &変数
ポインタ = ポインタ
ポインタ = 定数

*ポインタ = 変数
変数 = *ポインタ
*ポインタ = *ポインタ
*ポインタ = 定数

という6つの形があります。
今まで行ってきた変数の代入とは少し違う部分があるので注意が必要です。
まずはサンプルプログラムを見てみましょう。

スポンサーリンク

サンプルプログラム

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

実行方法

上のソースを書き写してステップ実行して動作を確認してください。
ptr と a の値の変わり方に注目してください。

ポインタへの色々な代入

ポインタはアドレスを保持するための変数です。
アドレスが分かるということは、そのアドレスに入っている値も分かるということです。
そのため、色々な代入ができることになります。

ポインタ = &変数

サンプルプログラムの

ptr0 = &a;
ptr1 = &b;

は、アドレス演算子を使って、変数 a のアドレスを ptr0 に、変数 b のアドレスを ptr1 に保存しています。
※ アドレスが分からなくなったならこちらを参考にしてください。
→ ポインタとアドレス

ポインタは、アドレスを保存するための変数なので、変数のアドレスを代入することは可能です。 もし、

ptr0 = a;
ptr1 = b;

とするとポインタに a や b の値を入れることになるのでエラーになります。

ポインタ = ポインタ

サンプルプログラムの

ptr1 = ptr0

は、ポインタ同士の代入になります。
お互いにポインタ型の変数なので、通常の変数の代入と同じ記載方法でアドレスの代入が可能になります。

ただ、ポインタ同士で型が違うときは警告が出るので注意してください。

こちらのサンプルでは、ptr0 は long 型、ptr1 は char 型のポインタとして定義されています。
そして、ptr1 に ptr0 のアドレスを代入しています。

long 型のアドレスと char 型のアドレスは、お互いにアドレスではあるのですが、その中身の値のサイズが違います。 代入した後、*ptr1 として参照するときに long 型と char 型では違う値が取れてしまう可能性があるので警告が出ることになります。

実際に、このサンプルプログラムを実行してみると。 ptr1 は char 型のポインタなので、-127 ~ 127 までの数字しか扱えず、72583 とは出力されません。

このように、ポインタ同士の代入をするときは、型に注意してください。

ポインタ ← 定数

ポインタは、直接定数を代入することもできます。

ptr1 = 0;

ポインタはアドレス以外は代入できないと言いましたが、定数は入れることができます。
これは、アドレスが数字であるため、定数はアドレスとして認識することができるからです。

ptr1 = 0;
*ptr1 = 100;

とすると、アドレス 0 番に 100 を入れます。
アドレスはOSに管理されているので、自分で勝手にアドレスを決めて値を入れてはいけませんが、このような代入も可能です。

*ポインタ ← 変数

ポインタはアドレスを保持しているので、アドレスの中身の値を参照する「*」を使って以下のような代入もすることができます。

*ptr1 = a;

ptr1 の頭に「*」が付くことによって、

"ptr1 が指すアドレスの値を a の値にしろ"

という意味になります。

サンプルプログラムでは、

ptr1 = &b;
*ptr1 = a;

となっているので、ptr1 に変数 b のアドレスを入れた後、その中身の値を a の値にしています。
つまり、

b = a;

を間接的にやっていることになります。
このようにポインタを使うことで他の変数の値を間接操作する事ができます。

これがポインタの難しさであり、ポインタの特徴であり、便利な点です。
どうしても解らないという方は、とりあえずこう考えるのも有りです。

"*" が付くと、ポインタは変数に戻る

今回だと char 型の変数になってくれます。

*ptr1 は char型の変数
a も char型の変数

両者ともに同じ型になります。
よって、無事代入する事ができます。

変数 ← *ポインタ

「*」を付けることで、ポインタは変数に戻るという考えでいけば、「*」を付ければ変数への代入もできることになります。

a = *ptr1;

とすることも可能です。
これは、「ptr1 のアドレスの値を a に入れろ」という意味になり、問題なく代入できます。

*ポインタ ← *ポインタ

「*」を付けることで、ポインタは変数に戻るという考えでいけば、「*」を付ければポインタの値同士でも代入ができることになります。

*ptr0 = *ptr1;

という記載をすれば、ptr1 のアドレスの値を ptr0 のアドレスの値として代入します。

*ポインタ ← 定数

上と同じ考えで、定数を代入することもできます。

*ptr1 = 0;

という記載をすれば、ptr1 のアドレスの値を 0 として代入します。

ポインタの代入は記載ミスが起こりやすい

ポインタを使った代入は、慣れるまでは間違った記載をしてしまうことも多いと思います。
そんなときは、「*」が付けば普通の変数に戻る覚えておくと便利です。
前回でも書きましたが、C言語でプログラムを書くためにはポインタは必須です。
積極的に使って、ぜひ早めにマスターしてくださいね。

スポンサーリンク