[C言語の詳細な分析]関数の仮パラメーターと実際のパラメーター、値渡しと参照渡しに焦点を当てます

知識のポイントを説明する前に、まず質問をしましょう!

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)、実パラメーター(実パラメーター)と呼ばれます。ab

そしてSwap1、関数の内部に入るとSwap1(int x, int y)x合計y正式なパラメーター(正式なパラメーター)と呼ばれます

では、を呼び出すときに、実際のパラメーター正式なパラメーターSwap1函数に渡しますか?

現時点での結論は次のとおりです。

  • 関数が呼び出されると、実際のパラメーターが仮パラメーターに渡され、仮パラメーターは実際には実際のパラメーターの一時的なコピーになります。

一時的なコピーとは何ですか?

  • 仮パラメータには独自の独立したスペースがあり、実際のパラメータの内容をコピーして仮パラメータに入れるだけです。

したがって、仮パラメータの変更は実際のパラメータに影響を与えません

実際の参加パラメータ

実際のパラメーター(実際のパラメーター):

  • 関数に渡される実際のパラメーターは、実際のパラメーターと呼ばれます。

  • 引数には、定数、変数、式、関数などがあります。


  • 数量のタイプに関係なく、実際のパラメーターは、関数が呼び出されたときにそれらの値を正式なパラメーターに渡すために、明確な値を持っている必要があります。

正式なパラメーター(正式なパラメーター):

  • 仮パラメーターは
    、関数が呼び出されたときにのみインスタンス化(割り当てられたメモリー単位)されるため、関数名の後の括弧内の変数を参照します。したがって、これらは仮パラメーターと呼ばれます。

  • 関数呼び出しが完了すると、正式なパラメーターは自動的に破棄されます。したがって、仮パラメータは関数内でのみ有効です。

改訂

明らかに、今のコードは間違っているので、どのように変更するのですか?

先ほど書いた関数を思い出してください。

  • 関数を記述した後、の値をSwap1渡した後のスペースとのスペースは独立したスペースになりますa、bx、yx、ya、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そしてpbb
ここに画像の説明を挿入
*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、bSwap1函数

私が電話に行くとき、私アドレスSwap2函数に渡します、この方法は呼ばれます:アドレスによる電話a、bSwap2函数

値で呼び出す

関数の仮パラメータと実際のパラメータはそれぞれ異なるメモリブロックを占有し、仮パラメータの変更は実際のパラメータに影響を与えません

住所による電話

  • 参照による呼び出しは、関数の外部で作成された変数のメモリアドレスを関数パラメーターに渡すことによって関数を呼び出す方法です。
  • このようにパラメーターを渡す方法により、関数は関数の外部の変数との実際の接続を確立できます。つまり、関数の内部の変数は、関数の外部の変数を直接操作でき
    ます。

おすすめ

転載: blog.csdn.net/m0_63325890/article/details/121110577