2002・10・10]ポインターと計算機の仕組みC言語の中で、最も便利で強力な仕組みがポインタです。ポインタはなくても、プログラムは書くことができますが、ポインタを使うと効率的なプログラムを、わかりやすく書くことができます。いうのは、ポインタは計算機の仕組みと密接に関係しており、計算機の仕組みをわかりやすくプログラマに見せてくれるからです。これが、C言語がオペレーティングシステムなど計算機のハードウエアに近いところを扱わなくてはならないシステムプログラムによく使われる理由にもなっています。今回は、ポインタについて説明します。145)に書いてありますが、では「番地」とはなんでしょうか?計算機にはCPUとメモリがあることはしっていますね。メモリにはプログラムとデータが格納されていて、CPUがメモリの中にあるプログラムを読み取っていろいろな動作をしているのは計算機です。このメモリには、プログラムを実行するCPUがアクセスするデータも格納されています。何番目のバイトかを指定してアクセスします。全部で1000バイトのメモリであれば、0番から1000番の番号を指定してメモリにアクセスします。この何番目かのメモリかが「番地」(アドレス)です。1バイトごとといいましたが、整数を格納するためには整数は32ビットつまり、4バイトが必要なので、4つの連続したバイトを使って格納しています。この整数にアクセスするにはこのうち最初のバイトのアドレスを指定してアクセスします。簡単なたとえは、メモリとはデータをいれておくための箱です。アドレスとはその箱につけられている番号ということができます。ポインタとはこのようなアドレスをあらわす値の、C言語での呼び名です。実は、ポインタ(アドレス)はすでに皆さんは使っています。整数の入力をするときに、次のように書いていたはずです。変数名に&をつけると、変数のアドレス、つまり、変数へのポインタなります。これまで、データを入れたり、取り出したりするために使ってきた変数や配列もその実体はどこかのメモリです。プログラミング言語ではメモリ上のどこかに変数xを入れるための箱を確保し、その箱にxという名前をつけているわけです。&xは、その箱のアドレスを表します。ある場所、つまりアドレスを渡しているわけです。このアドレスをどこかに取っておくことを考えましょう。アドレス(ポインタ)を格納するための変数をポインタ変数といいます。C言語では、ポインタ変数の宣言にはそのポインタがどのようなデータ型を格納しているかを指定しなくてはなりません。変数の宣言のデータ型として、値のアドレスのところに格納するデータ型とその後に*をつけて、宣言します。以下のように宣言します。*p;この変数には、整数へのポインタ(アドレス)が格納できます。&x;とすればよいわけです。格納する」といいます。ポインタ変数を使って、そのポインタ変数に格納されているアドレスのところにある整数を読み出してみましょう。そのためには、ポインタ変数に*をつけます。代入するには、以下のようにします。足して、yに入れるには以下のようにも書くことができます。100;ポインタ変数に格納されているアドレスはいわばデータがどこにあるかを示すものです。指されているデータを参照する」といいます。代入に使うこともできます。1;めには、以下のように書きます。&a;右のプログラム列は、ポインタ変数を使って、変数のやり取りを例です。*p;がプリントされるか考えてみましょう。アドレス、つまり「xへのポインタ」を引数にしていました。ポインターを引数とする関数を定義するには、関数のパラメータとしてポインタ変数を宣言します。t;}この関数を使って変数を取り替える場合には、変数へのポインタを引数にします。bを取り替えるには、swap(&a,&b);として、それぞれの変数のアドレス、つまりポインタを引数にします。文で1つの値しか返すことができませんでした。ポインタの引数を使えば、複数の値を返すことができます。時に返す手続きは以下のようにします。return;}配列とポインタすでにポインタを使っているもう一つの例は配列です。変数と同じように配列もその実体はどこかのメモリです。A[100];と宣言したときには、100個の整数分の連続したメモリを確保して、それにAと名前をつけたものということができます。書いたときにはその内容が参照されるのに対して、Aという名前はその配列のメモリのアドレスそのものを表します。変数のようにA=1のようなことができません。Aはアドレスそのものなので、それ自身がポインタとして扱うことができます。格納することができるのです。A[0]の値となります。文字列は、文字の配列であると説明しました。渡す引数は文字列のアドレスです。&をつけなくてもいいわけです。scanf(“%s”,s);配列を引数にするときに配列名を引数に書きますが、その関数のパラメータの宣言はポインタ変数として宣言します。宣言されているものとしてよい。