プログラム言語 II TOP

ポインタの概要



1. ポインタ
プログラム中で使われる変数には,メモリが割り付けられています。

変数に値を格納するということは,対応するメモリに値を書き込むことになります。また,変数の値を参照するということは,メモリに格納されている値を読み出すことになります。

プログラム中では,変数名を指定することにより,値を格納したり,参照したりすることができます。

一方,メモリには番地(アドレス)が振られていて,機械語のプログラムでは番地を指定することにより,メモリの特定の場所に値を書き込んだり,そこから値を読み出したりします。

この番地を,プログラム中で使えるようにするものがポインタ(pointer)です。


2. ポインタ変数
整数型の変数 a が宣言されているとします:

  int a;

メモリのどこかに整数を格納する場所を確保し,それを a に割り当てます。プログラム中では,その場所は a という変数名で指定することができます(当然,そこには番地も振られている)。

ここで

  int *p;

という宣言があったとします。このとき,p は"整数を格納する場所(メモリ)へのポインタ変数"ということになり,

 p = &a;

という代入により,変数 a に割り当てられたメモリの番地が,ポインタ変数 p に格納されます(&a は,a の番地を表す。a へのポインタと呼ぶことがある)。

  

この図のように,変数 p が,変数 a を指す(point)するようになります(ここでも,p は a へのポイントと呼ぶことがある)。

この状況で,*p と書くと,a に格納されている値を意味することになります。つまり,

  *p = 3;

を実行すると,a に 3 が格納されます。次に

  if ( *p > 5 ) …

を実行すると,*p の値,つまり a に格納されている値 3 と 5 の大小比較が行われます。


さて,整数型の変数として b も宣言されているものとします。当然,ポインタ変数 p は,b も指すことができます。しかも,プログラムの実行に伴い,p はある時は a を,別のときは b を指すことができます。

  int a, b;  /* 整数型変数の宣言 */
  int *p;   /* 整数へのポインタ変数の宣言 */
   ・
   ・
   ・
  p = &a;
  /* ここでは,p は a を指す */
   ・
   ・
   ・
  p = &b;
  /* ここからは,p は b を指す */
   ・
   ・
   ・


3. ポインタを使ったプログラム例
その1

  

説明する必要はないと思います(意味は分かりますね?)。


その2

  

fp が指す相手がプログラムの実行中に変わる例です(こういった点が,ポインタを使うメリットであり,プログラムが分かりにくくなる原因になります)。


その3

  

引数にポインタを使った例です。

実引数 &c により,関数 sum には c の値ではなく, c の番地(つまり,c へのポインタ)が渡されます。それを関数では,ポインタ仮引数 y で受け取っています。そして,関数中で,値を y が指す先,つまり c に格納しています。

このようにポインタを用いることにより,関数中で求めた値を,返却値以外の方法で,関数を呼び出した側に返すことができます。


4. 演習
1. 次のプログラムを実行すると,正しく実行される場合がある。しかし,プログラムに誤りがある。どこに誤りがあるか述べなさい。

  

(実行するとエラーが発生する場合もありますが,このようなミスはよく見掛けます。しかも,教科書の例題でもあったりします。)


2. 配列(5) 演習の 3 b) のプログラムを作りなさい。

 解答例



プログラム言語 II TOP