C/C++ のスワップ関数に関する 3 つの方法

ヒント:記事作成後に目次を自動生成することもできますが、生成方法については右のヘルプを参照してください。


序文

プログラミングを学ぶ上で理解しておくべき交換関数の一例ですが、私の理解の一部をご紹介しますので、皆様のお役に立てれば幸いです。


1.交換機能の説明

main関数で2つの値を作成し、関数を呼び出すことでそれらを交換します。

2. 3 つの状況の説明

1. 価値の移転

コードは次のとおりです(例)。

#include<iostream>
using namespace std;
//1.值传递
void Swap1(int x,int y)
{
    int temp = x;     //定义中间变量,用于交换两个数值的中间媒介
    x = y;
    y = temp;
}
int main()
{
    int a = 20, b = 30;
    Swap1(a,b);        //调用交换函数1
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    system("pause");
    return 0;
}

1.1值传递的运行结果

2つの関数の値を交換したいことがわかりますが、交換が実装されていません。

図からわかるように、値渡し関数は実際のパラメータ (a、b) の値を変更せず、仮パラメータの値のみを変更します (確認するために、出力ステートメントを関数に追加して、仮パラメータが変更されたかどうかを確認できます)

 

 仮パラメータが変更されていることがわかります。関数呼び出しが終了すると、x と y の対応するメモリがクリアされます。その後、コードは引き続き実行され、main 関数に戻って出力ステートメントを実行します。

 2.アドレスで電話をかける

#include<iostream>
using namespace std;
//2.地址传递
void Swap1(int *p1,int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	//cout << "x=" << *p1 << endl;
	//cout << "y=" << *p2 << endl;
}
int main()
{
	int a = 20, b = 30;
	Swap1(&a,&b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	system("pause");
	return 0;
}

操作結果:

 図からわかるように、アドレスによる呼び出しでは 2 つの値の交換が実現されます。 Swap1(&a,&b) はアドレスを渡すため、ポインターを使用して void Swap1(int *p1, int *p2) を受け取ります。ポインタ p1 は a のメモリを指し、ポインタ p2 は b のメモリを指していることがわかります。 *p1と*p2はaとbのメモリデータを操作して実パラメータの値を変更するため、関数呼び出し後にaとbの値が交換されます。

3. 関数パラメータとしての参照

#include<iostream>
using namespace std;
//3.引用作为函数参数
void Swap1(int &x,int &y)
{
	int temp=x;
	x = y;
	y = temp;
}
int main()
{
	int a = 20, b = 30;
	Swap1(a,b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	system("pause");
	return 0;
}

操作結果:

 図からわかるように、2つの数値の交換が実現されており、参照は「エイリアス」を与えるものとして理解でき、アドレスaとxを同時に操作することができ、このメモリ内のデータを同時に操作することができます。したがって、メモリ内の実際のパラメータは、仮パラメータが解放されるかどうかに関係なく変更されます。

 参照変数の説明

#include<iostream>
using namespace std;
//对于引用变量的解释
int main()
{
	int a = 10;
//创建引用变量的语法:“ 数据类型 &别名=原名;”
	int& b = a; //a和 b可以同时操作a这块内存的数值
	int c = 20;
	b = c;
	cout <<"a=" << a << endl;
	system("pause");
	return 0;
}


要約する

これら 3 つの方法についての私の理解を共有してください。皆さんのお役に立てれば幸いです。何か間違っている、または不正確な点がある場合は、メッセージを残してアドバイスをいただければ幸いです。ありがとうございます。

おすすめ

転載: blog.csdn.net/m0_74058637/article/details/129172674