引数とポインタ

関数に引数を付けることで、ある関数から別の関数に変数の値を知らせることは出来ます。
しかし、ある関数から別の関数の変数の値を操作することは出来ません。
言葉で表すのは難しいので実際にサンプルを見てみましょう。

#include <stdio.h>

void swap(int x,int y);

int main()
{
  int x=3,y=5;
  swap(x,y);
  printf("x=%d,y=%d\n",x,y);
  return 0;
}

void swap(int x,int y)
{
  int temp;

  /*xとyの値を交換*/
  temp=x;
  x=y;
  y=temp;
}

----------
実行結果
----------
x=3,y=5

一見、正しそうなソースですが、実行結果を見て解るとおり、
main関数の変数xと変数yの値は初期値のままで変わっていません。
これの原因は変数の有効範囲にあります。

5章 変数の有効範囲にあるように、変数の有効範囲はブロック単位です。
関数が変われば同じ名前の変数も全く別のものとして扱われます。
引数はあくまでも呼び出しもとの変数の値を呼び出し先の変数に代入しているに過ぎません。

ここで登場するのがポインタです。
ポインタを引数に用い、変数の値ではなく変数のアドレスを送ればどうなるでしょうか。
同じアドレスであれば関数が違えど必ず同一の変数を利用できます。
上のソースをポインタを使って書き換えたものが下です。

#include <stdio.h>

void swap(int *pX,int *pY);

int main()
{
  int x=3,y=5;
  swap(&x,&y);
  printf("x=%d,y=%d\n",x,y);
  return 0;
}

void swap(int *pX,int *pY)
{
  int temp;

  /*xとyの値を交換*/
  temp=*pX;
  *pX=*pY;
  *pY=temp;
}

----------
実行結果
----------
x=5,y=3

今度はmain関数の変数xと変数yの値は入れ替わっています。
最初のソースと違う点は、swap関数の引数として変数x,yのアドレスを送っていることです。
こうすることでswap関数はmain関数の変数x,yのメモリ上の位置を知ることが出来ます。
後は間接参照演算子を用い、ポインタの指し示す先の変数を操作するだけです。

ポインタを用いることによって他の変数の値を操作できる
これがC言語のポインタの存在意義の大きな理由の1つです。