予習は大事

半年ぶりの投稿になるけれどもそこについてはしれっと流すことにする。

ただ、その分ネタがあるので本日は二回にわけるつもりだ。

とりあえずは今週の授業の話をする。




タイトルの下に書いてある通り、僕は情報系の大学生だ。勿論大学でプログラミングの授業を受けている。だが、その授業の進み具合があまりに遅かったりバラついていたりということもあるのでこれまでできるだけ自分で予習をしながら受けてきた。進行予定をすっ飛ばしてファイル入出力に入った時はさすがにどうしようもなかったが、それでも大体はこれで上手くいってきた。

その予習が今週の演習で今までに増して一番の効果を発揮した。この時は予習していて本当によかった、と思った。その授業の内容は「ポインタ」。

どうもポインタは2回にわけて講義するらしい。今回取り扱ったのはポインタの初歩だ。

いわゆる「ポインタ演算子」と「アドレス演算子」に慣れましょう、といった具合。

ここのところに関してなら得意だ。なにせ先日も紹介した「プログラミングスレまとめ in vip」でポインタについては既に読み込んである。ポインタ入門程度なら難なく理解できた。




が、授業でひとつ問題があった。

授業用に配布されたプリントに何気なく書かれたコードの例がこれだ。

#include
main()
{
float b[3]={36.5,38.4,37.5};
printf("address of b[0]: %p, *b :%p\n",&b[0],*b);
printf("address of b[1]: %p, *(b+1) :%p\n",&b[1],*(b+1));
printf("address of b[2]: %p, *(b+2) :%p\n",&b[2],*(b+2));
}

続く実行結果の欄は

address of b[0]: (アドレス), b :(アドレス)
address of b[1]: (アドレス), b :(アドレス)
address of b[2]: (アドレス), b :(アドレス)

となっていた。だがこれはおかしい。先程ここのところに関してなら得意だ、などといったが実は僕はこの授業を受けるまで配列とアドレスの関係をイマイチ理解していなかった。各所で実は深い関係性がある、などと小耳に挟んでいた程度で、変数指定に配列を使えるとは知りもしなかった。




そんなわけで、「へぇ、そうなのか」と思いながら先生の話そっちのけでプリントをしげしげと眺めていた僕であったが、このコードをみてふと疑問を感じた。

実行結果は両方ともアドレスを表示している。「%p」が2回出てくるからこうなるのだろう。だが2度目の「%p」のアドレス指定に使われているのが「*b」である。たしかポインタ演算子である「*」は、その後に続く変数に保存されている値を参照する演算子ではなかったのか?

「a」と「pa」という変数があったとする。前者はint型で、後者はそのアドレス型、int*型である。

もし「pa=&a」という処理があったら、paの中にはaのアドレスデータが入るわけだ。よって「pa」の中を「printf」などで表示するには「%p」を用いるしかない。

だが、ここで「pa」に含まれている値と「a」のアドレスが同値であることを利用して、「a」の値を知ることができる。その時に「*」が演算子として用いられるのだ。(ポインタ宣言の時はまた別)




……と、ポインタに関する詳しい説明はもっとわかりやすいものがネットにゴロゴロ転がってるからこの辺にしておくとして、ともかく今回の例文コードである。

はっきり言うと間違ってる。「*b」を表示するなら2度目は「%p」ではなく「%f」であるべきだろう。実際この例文通りにコンパイルしてみたら実行結果はエラーとなってしまった。

実際に再現しようと自宅で試してみたがエラー内容はアドレスが全て0で表示されるという結果だった。「00000000」という具合だ。大学のPCでは確か「nil」と表示されたと思う。とりあえず「nil」についてその場でググってはみたがイマイチ「null」との違いがわからなかった。

ティーチングアシスタントに聞いてみたところTAも把握してなかったらしく混乱していた。色々試してみた結果どうやら「*」が余分だったらしく取り外したら上手くいった。要するにこのコードは&b[x] (b+x)が全く同じものを表しているということを示したかったらしい。

その後先生の方から「配列を用いる時、アドレスを表す時は*をつけず、変数に格納された値を表すときは*をつける」という補足説明が入った。




……こんなんだからポインタは難しい、と言われてしまうのではないだろうか。

とりあえず、配列とポインタの関連については勉強になる授業だった。

来週は文字データのポインタ、おそらくヌル文字が登場する回となるだろう。