11-1. で見てきたように、下位の関数(呼ばれる側)から上位の関数(呼ぶ側)へ戻り値を返すことができますが、 その方法には、「1個の戻り値」を返す方法と、「複数の戻り値」を返す方法があります。
さらに、複数の戻り値を返す場合には、「複数の変数のアドレス」を引数にする場合と、 「配列のアドレス」を引数にする場合があります。
return 戻り値; で値を返す ⇒ 11-1. 参照
複数の変数のアドレスを引数にして、上位関数側と下位関数側でデータを共有し、見かけ上、複数のデータを返したようにします。
#include <stdio.h> void swap(int *x, int *y); int main(void) { int a = 123, b = 456; printf("呼出し前a = %d b = %d\n", a, b); swap(&a,&b); /* 変数a と変数b のアドレスを渡す */ printf("呼出し後a = %d b = %d\n", a, b); return 0; } /* 変数a のアドレスをポインタx に、変数b のアドレスをポインタy に入れる */ void swap(int *x, int *y) { int wk; wk = *x; *x = *y; /* ポインタを使って中身を入換える。*/ *y = wk; }
呼出し前 a = 123 b = 456 呼出し後 a = 456 b = 123
配列の先頭要素のアドレスを引数にして、上位関数側と下位関数側で配列を共有し、見かけ上、複数のデータを返したようにします。
#include <stdio.h> void waru2(int *p); int main(void) { int i; int dt[] = { 20, 10, 4, 35, 66, 78, -1 }; waru2(dt); /* 配列の先頭要素のアドレスを渡す */ for(i = 0; dt[i] != -1; i++) { printf("%d ", dt[i]); } printf("\n"); return 0; } void waru2(int *p) /* 配列dt のアドレスをポインタp に入れる */ { while(*p != -1) { *p = *p / 2; /* ポインタの中身を 2 で割る */ ++p; } }
10 5 2 17 33 39
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved