皆さんこんにちは、南 晴輝 です。
今回から、未公開のC言語講座 です。
ポインタとは
プログラムが実行されているとき、プログラムや変数などはメモリー上に格納されています。
すべてのメモリーにはアドレスが付けれています。
変数にアクセスするときプログラムはこのアドレスを指定してアクセスします。
アドレスは単なる数字なのでプログラマーにとってはわかりにくい存在です。
そこで変数名というプログラマーにわかりやすい名前で変数にアクセスすることができます。
ポインターは変数名ではなく、アドレスで変数にアクセスするためのものです。
今まで簡単に 変数を定義してきました。
変数の定義とは、メモリーに変数を入れるための領域を確保し、そのアドレスを保存しておく
という操作です。
試しにint型の変数を宣言し、それがどの領域(アドレス)に確保されたかを表示する
プログラムを示します。
#include <stdio.h>
void main(){
int n;
printf("変数nは%x番地に確保されました\n", &n);
}
上の例のようにアドレスを知るためには、変数の前に「&」をつけます。
アドレスで変数にアクセスするためには、アドレスを格納する変数が必要になります。
これは何型の変数なのでしょうか?
この変数がポインタと呼ばれるものです。ポインタはアドレスを入れるための専用の変数です。
これは今使っているコンピュータによってサイズが異なります。
現在のコンピュータの大半は 32bitのサイズ を持っています。
また、ポインタは色々な種類があり、int型のポインタ、char型のポインタなどがあります。
ポインタ変数の宣言は下のように、型の後に「*」をつけます。今までの変数のように、
宣言しただけではどんな値が入っているかわかりません。
int *p;
そのポインタが指すメモリーにアクセスするときには、ポインタ変数の前に「*」をつけます。
以下の例を参考にしてください。
#include <stdio.h>
void main(){
int a = 5;
int* p;
p = &a; // ポインタ変数pに変数aのアドレスを入れる
printf("変数aの値は%dです。\n", a);
printf("ポインタ変数pの値は0x%xです。\n", p);
printf("ポインタ変数pの指すメモリーの中身は%dです。\n\n", *p);
*p = 10; // ポインタ変数の指すメモリーを書き換える
printf("変数aの値は%dです。\n", a);
printf("ポインタ変数pの値は0x%xです。\n", p);
printf("ポインタ変数pの指すメモリーの中身は%dです。\n", *p);
}
変数aの値は5です。
ポインタ変数pの値は0x65fdf4です。
ポインタ変数pの指すメモリーの中身は5です。
変数aの値は10です。
ポインタ変数pの値は0x65fdf4です。
ポインタ変数pの指すメモリーの中身は10です。
ここで示すポインタ変数pの値は0x65fdf4ですが、これは、コンピュータの処理系によって
変わります。
くどいようですが、ポインタを使うときは、 メモリーのアドレス と そのアドレスの内容 を
セットとしてとらえたください。
最後まで読んでくださり、ありがとうございます。
次回は、配列について解説します。ポインタと配列は、いっしょに理解するのが効率がいいです。
今回より、かなり内容が複雑になりますが、一度理解できれば、とても有効ですので、
がんぱってください。