PR

9月15日 こうしろう,13歳の誕生日である。『MindStorms日記』をはじめてから2年たったわけである。- 13歳 - ご多分にもれず,彼も反抗期である。何を言っても『わかっとる』とブスッと答え,プイと横を向いてしまう。しかし,幸いにも私達には共通の言語がある。親として自分の考えを示せば,彼も自分の考えを述べてくれる。「言葉があって良かった」と感じると同時に,他の動物はどうしているのかと疑問に感じた。ひょっとして,反抗期というのは動物としての脳に刻み込まれた巣立ちの時期の記憶なのでは…,なーんてね(^^)。

 『話し合える反抗期』真っ盛りのこうしろうであるが,C言語の学習では時間を共有できる。コンピュータ言語にも感謝すべきか,などと父は思う。

 日経ソフトウエア連載の『ゼロから学ぶC/C++言語』で少しずつC言語の勉強を続けているこうしろうであるが,いよいよ最初の関門に差し掛かった。ポインタである。これまではこうしろうが勝手に勉強をしており,私は「なんか,わからないことがあったら聞けば」という姿勢でいたが,今回は説明に乗り出した。ポインタでつまづくケースが多いのである(私も一度つまづいた)。

 ポインタとは『他の変数のアドレス(メモリ上の番地)を格納する変数である』ことを理解する初めの一歩として,下記のサンプルプログラムをこうしろうが入力する。



#include<stdio.h>

int main(void)

{
 int a;

 int b[3];


 printf("変数aのアドレス:%ld\n",&a);
 printf("配列b[0]のアドレス:%ld\n",&b[0]);
 printf("配列b[1]のアドレス:%ld\n",&b[1]);
 printf("配列b[2]のアドレス:%ld\n",&b[2]);

 return 0;

}


 変数aと配列b(0から2の3つの整数型の要素を持つ)のアドレスを表示するプログラムである。

 コンパイルして,実行すると,
変数aのアドレス:6618624
配列b[0]のアドレス:6618612
配列b[1]のアドレス:6618616
配列b[2]のアドレス:6618620
と表示された。int(整数)型の変数は4バイト分メモリを使用するので,配列bの各要素が4バイト飛びで連続して確保されていることがわかる。「変数ちゃ,定義した順にメモリに展開されるわけじゃないがいな,こうしろう。」先に宣言した変数aの領域が配列bより大きいアドレスに確保されている。

 次に,実際にポインタを使用するサンプルを入力し実行する


#include<stdio.h>

int main(void)

{
 int a=20;

 int *p;

 p= &a;

 *p=10;
 printf("変数aのアドレス:%ld\n",&a);
 printf("変数aの値:%d\n",a);
 printf("ポインタ変数pが指す値:%d\n",*p);
 return 0;

}


 変数aに20を代入し,aのアドレスをポインタ変数pに代入する(&は変数のアドレスを取り出すアドレス演算子)。そしてポインタpの指し示すアドレスに10を入れている(*はアドレスからその場所にある変数を求める間接参照演算子)。変数aの値とポインタ変数pが指す値はともに10になる。

 こうしろうを悩ませたのが,次のサンプルプログラムである。


#include<stdio.h>

int main()

{
 int a[] = {1,3,5,7,9};

 int b[4],*pa,*pb,i = 0;


 pa = &a[1];

 pb = &b[0];


 while(i++ < 4)

  *pb++ = *pa++;


 for(i = 0; i < 4; i++)

  printf("b[%d] = %d\n",i,b[i]);

 return 0;

}


配列aの値をポインタ変数を使ってa[1]から順に配列bにa[1]→b[0],a[2]→b[1],a[3]→b[2] ,a[4]→b[3]と代入していく。結果,配列bには3,5,7,9と値がセットされる。こうしろうを???にさせたのが,ここである。

while(i++ < 4)

 *pb++ = *pa++;

 配列の値をコピーして,ポインタの指すアドレスを後置インクリメント演算子(++)で1ずつ(実際には4バイトずつ)増加させている。C言語らしい便利な書き方と言ってしまえばそれまでだが,確かにわかりにくい。「こんな風に書くのと同じことを1行で書いてあるんだよ」
while(i++ < 4) {

 *pb = *pa;

 pb++;
 pa++;
}
と実際にプログラムを書き換え実行してみた。同じ結果が表示され,こうしろうはナットク!の表情をみせた。