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