手順1:値を渡す
#include<iostream>
#include<cstdio>
using namespace std;
void Exchg1(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n",x, y);
}
int main()
{
int a = 4, b = 6;
Exchg1(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
Exchg1で交換されましたが、メイン機能では動作しませんでした。
理由:関数が呼び出されると、実際のパラメーターaおよびbの値がxおよびyに暗黙的に割り当てられ、作成された関数本体のaおよびbに対してこれ以上の操作は実行されません。交換は単にx、y変数です。a、bではありません。もちろん、aとbの値は変更されていません。関数は、aとbの値を有料の値を介してxとyに渡すだけです。関数の演算は、xとyの値がaとbの値ではないということです。これは値渡しと呼ばれます。
手順2:アドレス転送
#include<iostream>
#include<cstdio>
using namespace std;
void Exchg1(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
printf("x = %d, y = %d\n",*x, *y);
}
int main()
{
int a = 4, b = 6;
Exchg1(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
デジタルスワップを実現します。
関数の暗黙のコピー操作は、aとbのアドレスをxとyに与えることです。ポインタxとyの値は、それぞれa変数とb変数のアドレス値であることがわかります。次に、* x、* yの演算はもちろん、aおよびb変数自体の演算です。
手順3:参照渡し
#include<iostream>
#include<cstdio>
using namespace std;
void Exchg1(int &x, int &y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n",x, y);
}
int main()
{
int a = 4, b = 6;
Exchg1(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
デジタルスワップを実現します。
xとyは、それぞれaとb変数を参照します。このように、関数の実際の操作は、実際のパラメーターa、b自体です。つまり、関数をa、bの値に直接変更できます。
値の受け渡しと参照の受け渡しの違い:
1:関数定義フォーマットが異なります。
2:呼び出されたときと同じフォーマット。
3:機能が異なります。(1つの操作は変数自体ではなく、1つはそれ自体です)