ポインタ

今回は「C言語の中で最も難しい概念」とよく称される「ポインタ」についてやっていきます。
これは、そうすぐに理解できる内容ではないので、
なるべく多くの資料をあたって、理解を深めるようにしてください。

ポインタとは何かというと、「変数のアドレスの値を保持するための変数」です。
はっきりいってこの時点でよく解りません。(私もうまく表現できません(苦笑))
7章でやったとおり、変数の領域はメモリ上に存在し、その位置をアドレスといいます。
そのアドレスを保存する為に利用するのですが、まあとりあえず作るところから。

/*ポインタ作成*/
データ型 *ポインタ名;

int *p;/*例*/

基本的には変数の宣言と同様で、ポインタ名の前にアスタリスク(*)を付けるだけです。
ただし、このアスタリスクは「乗算演算子」ではなく「ポインタ演算子」と呼びます。
また、データ型は代入するアドレスを持つ変数のデータ型にあわせます。

次は、アドレス演算子(&)について見てみましょう。
アドレス演算子はこれまでにscanf関数で利用しましたが、
その詳細についてはこれまでやってきていませんでしたね。
&変数名 とすると、その変数の開始アドレスが返されます。
とりあえず、下のサンプルをご覧ください。

#include <stdio.h>

int main()
{
  int data=0;
  int *p; /*ポインタpの宣言*/

  p=&data;/*ポインタpに変数dataのアドレスを代入*/
  printf("data=%d\n",data);
  printf("p=%d\n",p);
  printf("&data=%d\n",&data);

  return 0;
}

上のソースをビルドし実行すると、変数dataの値は0、
ポインタpの値は変数dataのアドレスと同値になっていることがわかります。
メモリの状態については次の図をご参照ください。

          メモリ
      +--------+------+
      |[番地]  |[内容]|
      +--------+------+
data--|1000〜  | 0    | <--+
      |  1003  |      |    | アドレスを指し示す
      +--------+------+    |
   p--|1004〜  |1000  |----+
      |  1007  |      |
      +--------+------+

・アドレスはでたらめ。
・dataのアドレスが1000〜1003番地となっているのは
  int型の変数は(32bitの場合)4バイトの領域を占有するため
・pのアドレスが1004〜1007となっているのは
  ポインタは(32bitの場合)4バイトの領域を占有するため

しかし、ただ変数のアドレスを保持するだけでは何の役にも立ちません。
ポインタを利用すると「ポインタの指し示すアドレスの変数」を操作できます。
そうすると、あたかもポインタの先のアドレスの変数を使っているかのように出来ます。
(「7章 間接アドレス」を参照)

/*ポインタの指し示す先の変数の利用(x,yは変数、pはポインタ)*/
p=&x;/*ポインタpに変数xの値を代入*/
*p=3;/*変数xに3が代入される*/
y=*p;/*変数yに変数xの値が代入される*/

これまたポインタ名の前にアスタリスクを付けます。
しかし、このアスタリスクは「ポインタ演算子」ではなく、「間接参照演算子」と呼びます。
この間接参照演算子を利用すると、ポインタの指し示す先のアドレスの変数に影響を与えても、
ポインタ自体の値はまったく変動しません

結局、これでもまだ何のためのものかわかりませんが、
とりあえず、今回はここまでということで。