C++参照'&'


C++には、参照変数という複合タイプが追加されました.参照は、定義された変数の別名です.
参照変数の主な用途は、関数のパラメータとして使用されます.参照変数をパラメータとして使用すると、関数は元のデータではなく元のデータを使用します.
たとえば、コードのswap関数です.
1.文字列配列の参照を実現する
#include<iostream>

using namespace std;

//          

void main1()
{
	char a[3][10]{"hello", "world", "china"};
	char(& ra)[3][10](a);
	for (auto i : ra)
	{
		cout << i << endl;
	}
	cin.get();
}

void main()
{
	char *a[3]{"hello", "world", "china"};
	char * (&ra)[3](a);
	for (auto i : ra)
	{
		cout << i << endl;
	}
	cin.get();
}

2.文字列の二次元配列の参照を実現する
<pre name="code" class="cpp">#include<iostream>

using namespace std;

void main()
{
	char *a[3][10]{{ "hello", "world", "china" }, { "Obama", "Opera", "Modi" }, { "lady", "gaga", "justin" }};
	char * (&ra)[3][10](a);
	/*for (auto i : ra)
	{
		cout << *i << "  " << *(i + 1) << "   " << *(i + 2) << endl;
	}*/
	
	for (auto i : ra)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << *(i + j) << "  ";
		}
		cout << endl;
	}	
	cin.get();
}
 
 

3.         

<pre name="code" class="cpp">#include<iostream>

using namespace std;

void swap(int & a, int & b)
{
	int temp = a;
	a = b;
	b = temp;
}

void main()
{
	int a = 2, b = 3;
	int c = 10, d = 12;

	cout << a << "  " << b << endl;
	swap(a, b);
	cout << a << "  " << b << endl;
	void(*p)(int &, int &)(swap);
	void(*&rp)(int &, int &)(p);
	cout << c << "  " << d << endl;
	rp(c, d);
	cout << c << "  " << d << endl;

	cin.get();
}
 
 

4.           


<pre name="code" class="cpp">#include<iostream>

using namespace std;

void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

void main()
{
	int a = 2, b = 3;
	void(*p)(int &, int &)(swap);
	void(**pp)(int &, int &)(&p);
	void(** & rpp)(int &, int &)(pp);
	cout << "      " << a << "  " << b << endl;
	(*pp)(a, b);
	cout << "      " << a << "  " << b << endl;

	cin.get();
}
 
 

5.           

<pre name="code" class="cpp">#include<iostream>

using namespace std;

int add(int a, int b)
{
	return a + b;
}

int sub(int a, int b)
{
	return a - b;
}

int mul(int a, int b)
{
	return a*b;
}

int divi(int a, int b)
{
	return a / b;
}

void main()
{
	int a = 100, b = 10;
	int(*p[4])(int a, int b){ add, sub, mul, divi };
	int(*(& rp)[4])(int a, int b)(p);
	for (auto i : rp)
	{
		cout << i(a, b) << endl;
	}

	cin.get();
}
 
 
6.         


#include <iomanip>
#include<iostream>

using namespace std;

void main()
{
	int a[2][3][4]{{ { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }, { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }};
	int (& ra)[2][3][4](a);
	cout.flags(ios::left);
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << endl;
			for (int k = 0; k < 4; k++)
			{
				cout << setw(5) << ra[i][j][k];
			}
		}
		cout << endl;
		cout << endl;
	}

	cin.get();
}

7.実装パラメータと戻り値の両方が関数ポインタの関数の参照
#include<iostream>

using namespace std;

void(*p)(int &, int &)(swap);
void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

void(*& callfun(void(* & rp)(int &,int &)))(int & a,int & b)
{
	p = rp;
	return p;
}

void main()
{
	int a = 2, b = 3;

	cout << "      " << a << "   " << b << endl;
	void(*& newfun)(int &, int &)(callfun(p));
	newfun(a, b);
	cout << "      " << a << "   " << b << endl;

	cin.get();
}