関数と値のスワップ

授業で使ったreplitのソース(実行可能)

#include <iostream>

using std::cout;
using std::cin;
using std::endl;
//2つの値を表示する関数
void printAB(double _a, double _b)
{
	cout << "(a, b) = (" << _a << ", " << _b << ")" << endl;
}
//2つの変数の値を入れ替える関数(交換できない(´;ω;`))
//changeAB(0.0, 128.7); _a <- 0.0 _b <- 128.7
void changeAB(double _a, double _b)
{
	double tmp;
	tmp = _a; //tmpにaを保存
	_a = _b;
	_b = tmp;
}//<-仮引数_a, _bの生存範囲

//値の交換、参照渡しバージョン //アドレスの中身を書き換えてね &
void changeAB_ref(double &_a, double &_b)
{
	double tmp;
	tmp = _a; //tmpにaを保存
	_a = _b;  //_a = は、_aに引数で渡されたアドレスの中身に代入される
	_b = tmp; //_b = は、_bに引数で渡されたアドレスの中身に代入される
}

//値の交換、ポインタ渡しバージョン(アドレス渡し)
void changeAB_addr(double* _a, double* _b)
{
	// _a, _b :実引数のアドレス
	// *_a, *_b:実引数があるアドレスの中身の値
	double tmp;
	tmp = *_a; 
	*_a = *_b;
	*_b = tmp;
}

//実引数に何を代入して関数に渡しても、必ず5に変更しやがる関数
void change5(double &_var)
{
	_var = 5.0;
}

int main() {
	double a,b;
	a = 0.0;
	b = 128.7;
	printAB(a, b);
	//double tmp;
	//tmp = a; //tmpにaを保存
	//a = b;
	//b = tmp;
	//changeAB(a, b); // changeAB(0.0, 128.7);
	//changeAB_ref(a, b);//参照私の呼び方
	//変数のアドレスを取り出す演算子 &
	//ちゃんと変数がある場所のアドレスを渡さないとエラーになるよ(大変だよ)
	changeAB_addr(&a, &b);
	printAB(a, b);
	change5(a);
	change5(b);
	printAB(a, b);
	//値の交換はstd::swap(a,b)を使うと楽(同じ型同士だけだよ)
	a = 0.0;
	b = 5.2;
	std::swap(a,b);
	printAB(a, b);
	int iarr[5] = {1, 3, 2, 4, 5};
	cout << "スワップ前:" << endl;
	for(int i=0;i<5;i++)
		cout << "iarr[" << i << "]=" << iarr[i] << endl;
	std::swap(iarr[1],iarr[2]);
		cout << "スワップ後:" << endl;
	for(int i=0;i<5;i++)
		cout << "iarr[" << i << "]=" << iarr[i] << endl;
	//夏休み中に教科書の、
	//①3つのソート(選択、バブル、挿入)のアルゴリズムを疑似言語で書く
	//②疑似言語を見ながら、C++で配列のソートをするプログラムを3つ作ってみる
	//③3つのアルゴリズムのひどさを体感する。(配列数増やすといいよ)
    //配列の値の初期化は乱数とか使うとらくちんかな。		
	return 0;
}