C++ での参照とポインタによる引数の受け渡し
- 
          
            C++ で&variable表記を使用して参照により関数の引数を渡する
- 
          
            C++ で *variable表記を使用して参照により関数の引数を渡する
- 
          
            C++ で (&array_variable)[x][y]表記を使用して参照により 2D 配列を渡する
 
この記事では、C++ で引数を参照で渡す方法と、ポインターを渡す方法について説明します。
C++ で&variable 表記を使用して参照により関数の引数を渡する
    
引数の受け渡しは、異なるコードブロック間のデータ交換のための柔軟なインターフェイスを提供する関数の最も一般的な機能です。関数が呼び出されるたびに、渡された引数によってそのパラメーターが作成および初期化されます。一般に、引数の受け渡しでは 2つの方法が区別されます。値による受け渡しと参照による受け渡しです。後者の場合、パラメーターは対応する引数のエイリアスになります。次の例では、基本的な整数スワップ関数を示しています。ここでは、引数が参照によって渡され、int &var 表記が使用されています。swapIntegers 関数が戻ると、main 関数スコープの int オブジェクトが変更されます。
#include <iostream>
using std::cout;
using std::endl;
void swapIntegers(int& x, int& y) {
  int z = x;
  x = y;
  y = z;
}
int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";
  cout << "Swapping a and b ...\n";
  swapIntegers(a, b);
  cout << "a = " << a << " b = " << b << "\n";
  return EXIT_SUCCESS;
}
出力:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
C++ で *variable 表記を使用して参照により関数の引数を渡する
前の例と同様の動作は、ポインターを使用して実装できます。ポインタはオブジェクトのアドレスであり、*演算子を使用して逆参照してオブジェクト値にアクセスできることに注意してください。ポインタを使用して引数を渡すということは、関数スコープから指定されたオブジェクトにアクセスし、それらの値を変更して、戻り後も状態が保持されるようにすることができることを意味します。関数へのポインターを渡すには、address-of(&)演算子を使用してポインターにアクセスする必要があることに注意してください。
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
void swapIntegers2(int* x, int* y) {
  int z = *x;
  *x = *y;
  *y = z;
}
int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";
  cout << "Swapping a and b ...\n";
  swapIntegers2(&a, &b);
  cout << "a = " << a << " b = " << b << "\n";
  return EXIT_SUCCESS;
}
出力:
a = 45 b = 35
Swapping a and b ...
a = 35 b = 45
C++ で (&array_variable)[x][y] 表記を使用して参照により 2D 配列を渡する
2 次元の C スタイルの配列参照を関数に渡すと便利な場合もありますが、表記は少し直感的ではなく、誤った結果につながる可能性があります。任意の SIZE 次元の整数の配列がある場合、関数パラメーターから次の表記で参照できます-int (&arr)[SIZE][SIZE]。括弧 () が欠落していると、int オブジェクトへの参照の配列として解釈され、コンパイルエラーが発生することに注意してください。
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
void MultiplyArrayByTwoV2(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    for (int& j : i) j *= 2;
  }
}
void printArray(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
}
constexpr int SIZE = 4;
int main() {
  int array_2d[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
  MultiplyArrayByTwoV2(array_2d);
  printArray(array_2d);
  return EXIT_SUCCESS;
}
出力:
[  2,  4,  6,  8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
