C++ でポインタを返す

胡金庫 2023年10月12日
  1. C++ で関数からポインタを返すには std::string::data 関数を使う
  2. C++ で関数からポインタを返すに&variable アドレス演算子を使う
C++ でポインタを返す

この記事では、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 ]
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Pointer