C++ でポインタを返す
![C++ でポインタを返す](/img/Cpp/feature-image---return-a-pointer-in-cpp.webp)
この記事では、C++ の関数からポインターを返す方法のいくつかの方法について説明します。
C++ で関数からポインタを返すには std::string::data
関数を使う
関数の戻り型は通常、値、参照、またはポインターの 3つのカテゴリーに分類されます。それらのすべてには、最適なユースケースがあります。
ほとんどのパフォーマンスに到達します。一般に、C++ はより雄弁な概念、つまりオブジェクトをコピーせずに関数を使用して受け渡しおよび返すための参照を提供するため、関数からポインターを返すことは C 言語でより一般的です。ポインターをより適切に利用できるシナリオもありますが、さまざまなデータ構造のポインター値を返す方法の例をいくつか示します。
次のサンプルコードでは、std::string
への参照を取得し、基になるデータ型である char*
を返す関数を実装します。std::string
クラスは、連続して格納された char
シーケンスを含むために使用されることに注意してください。data()
組み込み関数を使用してシーケンスの最初の文字へのポインタを取得し、return
ステートメントの後に渡すことができます。最後に、必要に応じて返されたポインタを使用して、char
配列を操作できます。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
char *reverseString(string &s) {
reverse(s.begin(), s.end());
return s.data();
}
int main() {
string str = "This string shall be reversed";
cout << str << endl;
cout << reverseString(str) << endl;
return EXIT_SUCCESS;
}
出力:
This string shall be reversed
desrever eb llahs gnirts sihT
C++ で関数からポインタを返すに&variable
アドレス演算子を使う
&
アドレス演算子は、C 言語にルーツがあり、C++ は同じセマンティクスでそれを使用して、それに続くオブジェクトのメモリアドレスを取得します。ただし、operator&
がオーバーロードされている場合は、動作が少し異なります(ページを参照)。この場合、引数の 1つとして配列を受け取り、同じ配列へのポインターを返す関数を示します。配列オブジェクトへのポインタは配列の最初の要素へのポインタと同じであるため、次の表記を使用できます-&arr[0]
は、指定された配列のアドレスを返します。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
int *subtructArray(int arr[], size_t size, int subtrahend) {
for (size_t i = 0; i < size; ++i) {
arr[i] -= subtrahend;
}
return &arr[0];
}
int main() {
int c_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 3;
auto arr_size = sizeof c_array / sizeof c_array[0];
int *ptr = subtructArray(c_array, arr_size, num);
cout << "c_array = [ ";
for (int i = 0; i < arr_size; ++i) {
cout << ptr[i] << ", ";
}
cout << "\b\b ]" << endl;
return EXIT_SUCCESS;
}
出力:
c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]
または、関数ブロックで配列が参照されている変数名だけを使用して、前のコードを書き直すこともできます。関数がパラメーターとして int arr[]
を取りますが、コンパイラーはその下の配列をコピーせず、ポインターをその配列に渡すことに注意してください。arr
名を return
ステートメントに渡すだけで、ポインタが返されます。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
int *subtructArray(int arr[], size_t size, int subtrahend) {
for (size_t i = 0; i < size; ++i) {
arr[i] -= subtrahend;
}
return arr;
}
int main() {
int c_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 3;
auto arr_size = sizeof c_array / sizeof c_array[0];
int *ptr = subtructArray(c_array, arr_size, num);
cout << "c_array = [ ";
for (int i = 0; i < arr_size; ++i) {
cout << ptr[i] << ", ";
}
cout << "\b\b ]" << endl;
return EXIT_SUCCESS;
}
出力:
c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]