C++ での参照によるポインタの受け渡し
胡金庫
2023年10月12日
この記事では、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,
著者: 胡金庫