PR

 今回からは,数回にわたってポインタを扱っていきます。「ポインタはC言語の最大の難関である」とよく言われますが,あえて言い切ってしまいましょう。それは「ウソ」です。

 たしかに,ポインタを使ったC言語のプログラムには,独特の書き方があります。“ポインタのポインタ”など複雑な使い方もできてしまい,このようなプログラムは普通読みにくいものです。しかしポインタそのものは,そう難しいものではありません。

 ポインタが使えるようになると,C言語では一気にプログラミングの幅が広がります。それゆえ,入門者向けの解説書であってもポインタの登場をきっかけに,さまざまなテクニックが紹介され,急に難しくなったように感じられるのではないかと筆者は考えています。でもこれは,ポインタは応用が効くということの証(あかし)でもあるのです。

 本連載はあくまでも「プログラミングの基礎」ですから,けっして急がず,今回は「ポインタとはなにか」にフォーカスを合わせて説明していきます。もし,読者の中に「C言語を勉強していたのだけど,ポインタでわからなくなってあきらめた」という方がいらっしゃれば,ぜひこの連載で再入門してみてください。

他の変数のアドレスを格納する変数がポインタ

図1●リスト1の実行結果
図1●リスト1の実行結果

 本連載の第2回で,変数はメモリーのどこかにある入れ物であること,メモリーのアドレス(番地)はアドレス演算子「&」を使えば取得できることを説明しました。簡単におさらいしてみましょう。

 リスト1は,int型の変数を三つ確保し,確保された変数のアドレスを表示するプログラムです。実行すると,図1のように変数a,b,cのそれぞれのアドレスが表示されます。

リスト1●int型の変数を三つ確保し,それらのアドレスを表示する
リスト1●int型の変数を三つ確保し,それらのアドレスを表示する

表1●16進数と2進数の対応
表1●16進数と2進数の対応

 アドレスは16進数8桁で表示されています。表1のように16進数1桁でメモリーの最小単位であるビットを四つ,つまり4ビットを表現できますので,それが8個集まれば,32ビットになります。みなさんがパソコンで利用するWindows 98/Me/2000/XPなどのOSでは,メモリーのアドレスは32ビットで管理されているのです。32ビットでアドレスを指定することを「32ビット・アドレッシング」と言います。他に64ビット・アドレッシングを採用しているコンピュータもあります*1。まず「アドレスは32ビットで表現される」ことを頭に入れておいてください。

 図1では変数のアドレスが4ずつ変化していますね。例えば,1バイトで値を記憶するchar型だと,アドレスは一つずつ変化するのですが,int型は4バイト(8ビット×4=32ビット)のメモリー領域を使うので,4ずつ変化するのです(図2*2


図2●int型は4バイトのメモリーを利用する
図2●int型は4バイトのメモリーを利用する