C++参照'&'
C++には、参照変数という複合タイプが追加されました.参照は、定義された変数の別名です.
参照変数の主な用途は、関数のパラメータとして使用されます.参照変数をパラメータとして使用すると、関数は元のデータではなく元のデータを使用します.
たとえば、コードのswap関数です.
1.文字列配列の参照を実現する
2.文字列の二次元配列の参照を実現する
参照変数の主な用途は、関数のパラメータとして使用されます.参照変数をパラメータとして使用すると、関数は元のデータではなく元のデータを使用します.
たとえば、コードの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(); }