今回は、初心者と中級者の分かれ目とも言えるポインタを使ってみましょう。
ポインタを使ったプログラムの解説
#include <stdio.h>
void main(void) {
int a; /* int型の変数aを宣言 */
int* p; /* int型でポインタ型の変数pを宣言 */
a = 10;
/* 変数aの値を表示 */
printf("変数aは%dです\n", a);
/* 変数aのアドレスを表示 */
printf("変数aのアドレスの値は0x%xです\n", &a);
/* ポインタ型の変数pに変数aのアドレスを代入 */
p = &a;
/* 変数pが指す値を表示 */
printf("ポインタ変数pの指す値は%dです\n", *p);
/* 変数aのアドレスを表示 */
printf("ポインタ変数pの値は0x%xです\n", p);
/* 変数pが指す値に20を代入 */
*p = 20;
/* 変数aの値を表示 */
printf("変数aの値は%dです\n", a);
}
変数aは10です
変数aのアドレスの値は0xfb8です.
ポインタ変数pの指す値は10です
ポインタ変数pの値は0xfb8です
変数aの値は20です
プログラムを実行すると上記のようになります。
変数aのアドレス値がここでは0xfa8と表示されていますが、
環境によって異なりますので、間違いではありません。
始めにポインタは難しいと言うイメージが定着してしまっていますが、
コツをつかめば、それほど難しくありません。
分かりやすく説明していきます。
まず、ポインタ型の変数を宣言しています。
int* p; /* int型でポインタ型の変数pを宣言 */
ポインタ型の変数は*アスタリスクをつけます。
次に変数aのアドレスを表示しています。
/* 変数aのアドレスを表示 */
printf("変数aのアドレスの値は0x%xです\n", &a);
&aと言う表記は、変数aのアドレスと言う意味を持ちます。
変数は、宣言するとメモリのどこかのアドレスに領域を確保します。
どこに確保されたか分からなくてもaと言う名前がついてるので、
プログラムを書く上では支障は出ません。
ポインタはそのアドレスの値をプログラムに使用できると言う事なんです。
続いて変数aのアドレスをポインタ変数pに代入し、
/* ポインタ型の変数pに変数aのアドレスを代入 */
p = &a;
/* 変数pが指す値を表示 */
printf("ポインタ変数pの指す値は%dです\n", *p);
ポインタ変数pが指す値を表示しています。
*pと言う表現は、pが指す値と言う意味で、この場合、pには、
変数aのアドレスが入っているので、
pが指す値は変数aの値と言う事になります。
その証拠に、表示されているポインタ変数pの値と
変数aのアドレス値が同じです。
/* 変数pが指す値に20を代入 */
*p = 20;
ポインタ変数pが指す値に20を代入しています。
ポインタ変数pには変数aのアドレスが入っているので、
変数aの値と言う事になり、
変数aに20を代入している事と同じ意味になります。
つまり、ポインタ変数pで変数aの値を変更する事ができる。
と言う事になります。
その証明として、プログラム実行結果で、
表示されたaの値が20になっています。
ここで戻ります。
ポインタ型は、4バイト固定の型となりますが、
ここでは、int型で宣言されています。
これは、ポインタが指す変数の変数型を書いておきます。
この場合は、aのアドレス値を利用するので、
aの変数型であるint型を使った。と言う事です。
次のような記述はもう理解できるようになっているはずです。
scanf(“%d”, &a);
&aは、aのアドレス値と言う意味ですね。
つまり、この関数の意味としては、キーボードから入力された数値を、
どこのアドレスに入れるかを指定する。
と言う意味だったんです。
ポインタは、なかなか理解するのに大変だとは思いますが、
この先どんどん出てくるので、
絶対に習得しなければならない技術です。
とは言え、すぐに理解できる人もまれです。
当HP管理人も、いい説明文に出会えなかったせいか
2、3ヶ月はかかったような気がします。
仕組みが想像できるようになれば理解も早くなります。
2回目ですが、ここが初心者と中級者との分かれ目です。
頑張って下さい!
ポインタの覚え方のコツ
記号の覚え方です。
&変数と書いてあったら、変数のアドレス値と読む。
例:&a aのアドレス値
*変数と書いてあったら、変数が指す値と読む。
(注意:ポインタ変数宣言時は違います。)
例:*a aが指す値