サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>複数の値を返す関数
[ポインタの配列(2)]←このソース→[関数や変数のメモリ配置]
/* 複数の値を返す関数は既出の変数の値を交換で扱っています。復習を兼ね、複数の値を返す関数についてより深く学習します。
関数の戻り値は1つです。複数の値を戻り値として必要な場合もあります。一般に、2つ以上の値を返す関数はポインタを使います。ポインタを使わない場合は、グローバル変数(外部変数)を使うことになります。安易にグローバル変数を使うのはプログラムの保守上好ましくありません。
今日は、数字を入力するとその値の2乗と3乗を返す関数を作ります。関数の名前をPower( )とします。
Power( )は3つの引数を取ります。最初の引数は入力された値です。これはdouble型の浮動小数点数です。後の2つは、double型のポインタです。関数の中では、受け取った値を2乗と3乗して、ポインタの指すアドレスに書き込みます。この関数はプロトタイプ宣言で、以下のように宣言します。
void Power(double x, double *sq, double *cu);
メインルーチンからは、下記のように呼び出します。
Power(x, &xx, &xxx);
呼び出し側(この場合はメインルーチン)では、カッコの中の変数を引数と呼びます。関数の側では、仮引数と呼びます。引数と仮引数では、順序と変数の型が一致すれば、変数の名前が異なっていても良いことになっています。この場合も名前が異なっています。なお、2つ目と、3つ目の引数は、メインルーチンからはアドレスを渡すので、変数の前に&を付けます。 */
#include <stdio.h> void Power(double x, double *sq, double *cu); void main(void); void Power(double x, double *sq, double *cu) { *sq = x * x; /* 2乗した値をsqの指すアドレスに書き込む */ *cu = x * x * x; /* 3乗した値をcuの指すアドレスに書き込む */ } void main(void) { double x, xx, xxx; printf("浮動小数点数を入力して下さい\t"); scanf("%lf", &x); /* xの値とxxとxxxのアドレスを関数に渡す */ Power(x, &xx, &xxx); printf("入力した値 = %lf その2乗 = %lf その3乗 = %lf\n", x, xx, xxx); } |
/* ポインタを使わないで、同等の関数を作ると、下に示すように、xxとxxxを関数の外で宣言して(外部変数またはグローバル変数と呼ぶ)、Power( )も下記のように改造する必要があります。
#include <stdio.h> void Power(double x); void main(void); double xx, xxx; void Power(double x) { xx = x * x; xxx = x * x * x; } void main(void) { double x; printf("浮動小数点数を入力して下さい\t" ); scanf("%lf", &x); Power(x); printf("入力した値 = %lf その2乗 = %lf その3乗 = %lf\n", x, xx, xxx); }
double xx, xxx;と関数の外で宣言すると、宣言した行より後ろにある同じファイルの他の関数から値を読み込んだり、書き込んだりできます。複数の関数で変数を共用する時に使います。
extern double xx, xxx;
というように、他のファイルの中でexternを付けて宣言すれば、他のファイルからでも、読み書きできます。この場合そのファイルには、その変数のためのメモリは割り付けられません。
もし、その変数を宣言しているファイルの中でだけ通用して、他のファイルから読み書きできないようにしたいなら、次のように宣言します。
static double xx, xxx;
*/
[ポインタの配列(2)]←このソース→[関数や変数のメモリ配置]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−