C++ での参照によるポインタの受け渡し

胡金庫 2023年10月12日
  1. &var 表記を使用して、参照によってオブジェクトを渡する
  2. *&var 表記を使用して、参照によりオブジェクトにポインタを渡する
C++ での参照によるポインタの受け渡し

この記事では、C++ で参照によってポインターを渡す方法に関する複数の方法を示します。

&var 表記を使用して、参照によってオブジェクトを渡する

通常、参照は C++ でオブジェクトのエイリアスを定義し、宣言中に初期化する必要があります。初期化された参照は指定されたオブジェクトにバインドされたままであり、別のオブジェクトに再バインドすることはできません。参照に対する操作は、バインドされたオブジェクト自体を変更します。したがって、これらはパラメータを関数に渡す一般的な方法です。参照を使用すると、呼び出し先関数スコープへのオブジェクトの暗黙的なコピーが回避されるため、参照が推奨される方法です。次の例は、指定された値の要素を検索する関数への const 参照による std::vector オブジェクトの受け渡しを示しています。

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

void findInteger(const vector<int> &arr, int k) {
  for (auto &i : arr) {
    if (i == k) {
      cout << "found - " << k << " in the array" << endl;
      return;
    }
  }
  cout << "couldn't find - " << k << " in the array" << endl;
}

int main() {
  vector<int> vec = {11, 21, 121, 314, 422, 4, 242};

  findInteger(vec, rand() % 100);

  return EXIT_SUCCESS;
}

出力:

couldn t find - 83 in the array

*&var 表記を使用して、参照によりオブジェクトにポインタを渡する

一方、*&var 表記を使用して、関数を参照することでポインターを渡すことができます。ポインタはオブジェクトそのものです。ポインタへの参照を関数パラメータとして渡すために、割り当てまたはコピーすることができます。この場合、&記号は参照表記であり、メモリ内のオブジェクトの場所へのポインタを取得するために使用される address-of 演算子ではありません。渡されたオブジェクトの値には、標準のポインター逆参照演算子-*を使用してアクセスする必要があることに注意してください。以下のサンプルコードは、指定された文字列オブジェクトの ASCII 値を cout ストリームに出力します。

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

void printASCII(string *&str) {
  for (auto &i : *str) {
    cout << (int)i << ", ";
  }
  cout << endl;
}

int main() {
  auto str = new string("Arbitrary string");

  printASCII(str);

  return EXIT_SUCCESS;
}

出力:

65, 114, 98, 105, 116, 114, 97, 114, 121, 32, 115, 116, 114, 105, 110, 103,
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Pointer