ポインタと引数


次のプログラムは有名な失敗プログラムです。変数 a と変数 b のを入れ替えるための swap 関数を作ってみましたが...

ソースコード

源文件
  1|/* swap01.c */                                                                        
  2|
  3|#include <stdio.h>
  4|
  5|int swap(int, int);
  6|
  7|int main(void)
  8|{
  9|  int a, b;
 10|
 11|  a = 10;
 12|  b = 20;
 13|
 14|  swap(a, b);
 15|
 16|  printf("a = %d, b = %d\n", a, b);
 17|
 18|  return 0;
 19|}
 20|
 21|int swap(int a, int b)
 22|{
 23|  int c;
 24|  c = b;
 25|  b = a;
 26|  a = c;                                                                              
 27|
 28|  return 0;
 29|}

実行結果

a = 10, b = 20

これは変数 a と変数 b の値そのおのを swap 関数に渡しているだけです。swap 関数では与えられた値を使って入れ替える作業をいますが、swap 関数内の変数と main 関数の変数は別物です。swap 関数内で扱った変数値は、swap の return の時点でどこにも保存されておらず、main 関数の変数には影響を与えません。だから main 関数の変数 a と変数 b にはなんの変化もなかったわけです。

このような関数呼び出しを値呼び出し(call by value)といいます。これは一種の安全ん装置も考えられます。兼んんす呼び出しによって不用意に変数の値が換えられることを防いでいるわけです。

これに対して、関数内で仮引数の値を変更すれば呼び出し元の実引数も変更される。という方法を参照呼び出し(call by reference)といいます。

実はC言語には参照呼び出しがありません。しかし引数に変数のアドレスを渡すことにより、参照呼び出しと同じことができます。アドレスを渡せば呼び出し元の変数の値を変更することができるのです。


ソースコード

源文件
  1|/* swap02.c */
  2|                                                                                      
  3|#include <stdio.h>
  4|
  5|int swap(int *, int *);
  6|
  7|int main(void)
  8|{
  9|  int a, b;
 10|
 11|  a = 10,  b = 20;
 12|
 13|  swap(&a, &b);
 14|
 15|  printf("a = %d, b = %d\n", a, b);
 16|
 17|  return 0;
 18|}
 19|
 20|int swap(int *x, int *y)
 21|{
 22|  int z;
 23|
 24|  z = *y;  *y = *x;  *x = z;
 25|
 26|  return 0;                                                                           
 27|}

実行結果

a = 20, b = 10


変数の値を関数に変更してもらうには、変数のアドレスを渡す。

Chapte6 @ C言語目録 @ HomeWork List @ 昭亮's Homepage