2つの番号を交換する機能
まず、関数が使えないのか、どうやって2つの番号を交換できるのか見てみましょう。
#include <stdio.h>
int main()
{
int a = 50;
int b = 100;
int temp = a;
a = b;
b = temp;
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
結果:aとbは交換を正常に実現しました。
では、関数の使い方は?
多くの人は、上記の交換番号の一部を関数に入れるだけだと思っているので、試してみましょう。
#include <stdio.h>
void swap(int x, int y){
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 50;
int b = 100;
swap(a, b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
結果:
分析:このコードでは、aとbの間に交換がないことがわかります。
では、xとyは入れ替わったのでしょうか?
関数内のx値とy値を出力するコードを追加して確認することができます。
コード:
void swap(int x, int y){
int temp = x;
x = y;
y = temp;
printf("x=%d y=%d\n", x, y);
}
結果:
分析:このコードでは、aとbが交換されていないことがわかりました。関数内で交換されるのはxとyで、xとyは作成された新しいローカル変数と同等ですが、aとbによって初期化されます。xとyを交換しても、aとbには影響しません。
その理由は次のとおりです。関数内でアクセスされるxとyは、aとbのオントロジーではありません。
この問題を解決するには、関数の外部の変数を関数の内部でアクセスできるようにする方法を見つける必要があります。C言語では、関数の外部のローカル変数に直接アクセスすることはできませんが、ポインターを使用して外部変数に間接的にアクセスすることはできます。
コード:
void swap(int* x, int* y){
int temp = *x;
*x = *y;
*y = temp;
}
ここでのスワップ関数は、次のコードと同等です。
int* x = &a;
int* y = &b;
int temp = *x;
*x = *y;
*y = temp;
int temp = a;
a = b;
b = temp;
printf("a = %d, b = %d\n", a, b);
このコードでは、最初に2つのポインター変数x、yを定義します。ここで、xはaのアドレスを保持し、yはbのアドレスを保持します。ポインタの逆参照を表し、ポインタが指すターゲットを示します。したがって、 xはaと同等であり、* yはと同等であり、一時変数tempを介してa、bを交換します。
最終的なコードの実装:
#include <stdio.h>
void swap(int* x, int* y){
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 50;
int b = 100;
swap(&a, &b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}