今回は、初心者と中級者の分かれ目とも言えるポインタを使ってみましょう。
ファイル名:main.c
#include <stdio.h>
void main(void) {
int a; /* int型の変数aを宣言 */
int* p; /* int型でポインタ型の変数pを宣言 */1
a = 10;
/* 変数aの値を表示 */
printf("変数aは%dです\n", a);
/* 変数aのアドレスを表示 */2
printf("変数aのアドレスの値は0x%xです\n", &a);
/* ポインタ型の変数pに変数aのアドレスを代入 */3
p = &a;
/* 変数pが指す値を表示 */4
printf("ポインタ変数pの指す値は%dです\n", *p);
/* 変数aのアドレスを表示 */5
printf("ポインタ変数pの値は0x%xです\n", p);
/* 変数pが指す値に20を代入 */6
*p = 20;
/* 変数aの値を表示 */7
printf("変数aの値は%dです\n", a);
} |
プログラムを実行すると以下のようになります。

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