知識のポイントを説明する前に、まず質問をしましょう!
例
2つの整数変数の内容を交換する関数を記述します
例えば:
交换前:20 30
交换后:30 20
タイトルは関数の形で書いてみましょう
#include <stdio.h>
void Swap1(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//交换两个变量
printf("交换前: a=%d b=%d\n", a, b);
Swap1(a, b);
printf("交换后: a=%d b=%d\n", a, b);
return 0;
}
演算結果:
20 30
交换前: a=20 b=30
交换后: a=20 b=30
は?どうしたの!なぜ交換が成功しなかったのですか?
心配しないで、ゆっくり見下ろしてください!
分析する
main関数の合計Swap1(a, b)
は、実パラメーター(実パラメーター)と呼ばれます。a
b
そしてSwap1
、関数の内部に入るとSwap1(int x, int y)
、x
合計y
は正式なパラメーター(正式なパラメーター)と呼ばれます
では、を呼び出すときに、実際のパラメーターを正式なパラメーターSwap1函数
に渡しますか?
現時点での結論は次のとおりです。
- 関数が呼び出されると、実際のパラメーターが仮パラメーターに渡され、仮パラメーターは実際には実際のパラメーターの一時的なコピーになります。
一時的なコピーとは何ですか?
- 仮パラメータには独自の独立したスペースがあり、実際のパラメータの内容をコピーして仮パラメータに入れるだけです。
したがって、仮パラメータの変更は実際のパラメータに影響を与えません
実際の参加パラメータ
実際のパラメーター(実際のパラメーター):
-
関数に渡される実際のパラメーターは、実際のパラメーターと呼ばれます。
-
引数には、定数、変数、式、関数などがあります。
-
数量のタイプに関係なく、実際のパラメーターは、関数が呼び出されたときにそれらの値を正式なパラメーターに渡すために、明確な値を持っている必要があります。
正式なパラメーター(正式なパラメーター):
-
仮パラメーターは
、関数が呼び出されたときにのみインスタンス化(割り当てられたメモリー単位)されるため、関数名の後の括弧内の変数を参照します。したがって、これらは仮パラメーターと呼ばれます。 -
関数呼び出しが完了すると、正式なパラメーターは自動的に破棄されます。したがって、仮パラメータは関数内でのみ有効です。
改訂
明らかに、今のコードは間違っているので、どのように変更するのですか?
先ほど書いた関数を思い出してください。
- 関数を記述した後、の値を
Swap1
渡した後、のスペースとのスペースは独立したスペースになりますa、b
x、y
x、y
a、b
- したがって
a、b
、正しい変更は影響しません、それらの間に接続x、y
はありません
次の名前の別の関数を書いてみましょう:Swap2
、関数に内部とSwap2
内部a、b
の接続を確立させます
では、どのようにそれらを接続するのですか?
答え:指针
#include <stdio.h>
void Swap2(int *pa, int *pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//交换两个变量
printf("交换前: a=%d b=%d\n", a, b);
Swap2(&a, &b);
printf("交换后: a=%d b=%d\n", a, b);
return 0;
}
コードを実行した結果:
20 30
交换前: a=20 b=30
交换后: a=30 b=20
分析する
最初に変数を作成a、b
し、aとbにそれぞれ20と30を入れました。
それから私a的地址
はそれを取り出して中に入れpa变量
ました。
それから私b的地址
はそれを取り出して中に入れpb变量
ました。
次に、pa
見つける能力、見つける能力a
、そして、pb
b
*pa = a
*pb = b
z变量
スワッピング用に別のものを定義し*pa
、*pb
値渡しと参照渡し
今書いたコードを見てみましょう
#include <stdio.h>
void Swap1(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
void Swap2(int *pa, int *pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//交换两个变量
printf("交换前: a=%d b=%d\n", a, b);
Swap1(a, b);
Swap2(&a, &b);
printf("交换后: a=%d b=%d\n", a, b);
return 0;
}
呼び出しに行くとき、私はそれに自分の変数Swap1函数
を渡します、この方法は呼ばれます:値による呼び出しa、b
Swap1函数
私が電話に行くとき、私はアドレスをSwap2函数
に渡します、この方法は呼ばれます:アドレスによる電話a、b
Swap2函数
値で呼び出す
関数の仮パラメータと実際のパラメータはそれぞれ異なるメモリブロックを占有し、仮パラメータの変更は実際のパラメータに影響を与えません
住所による電話
- 参照による呼び出しは、関数の外部で作成された変数のメモリアドレスを関数パラメーターに渡すことによって関数を呼び出す方法です。
- このようにパラメーターを渡す方法により、関数は関数の外部の変数との実際の接続を確立できます。つまり、関数の内部の変数は、関数の外部の変数を直接操作でき
ます。