C++ でポインタのベクトルを作成する

胡金庫 2023年10月12日
  1. C++ で [] 表記を使用してポインタのベクトルを作成する
  2. new 演算子を使って C++ のダイナミックメモリ上にポインタのベクトルを作成する
  3. C++ で std::vector コンテナを用いてポインタのベクトルを作成する
C++ でポインタのベクトルを作成する

この記事では、C++ でポインタのベクトルを作成する方法をいくつか説明します。

C++ で [] 表記を使用してポインタのベクトルを作成する

ポインタ型は簡単に変更できるので、以下の例ではポインタのベクトルを宣言するために int * を使用します。不透明なデータ構造を格納するために汎用のアドレス型が必要な場合や、逆にカスタム定義されたクラスへのポインタを使用する場合には、void * ポインタを使用することもできます。

この解決策では、固定長の配列を宣言する C スタイルの配列記法 [] を用います。これは通常の配列宣言に似ていますが、この場合は各要素のアドレスにアクセスすることに興味があります。ベクトル内のポインタにアクセスしてコンソールに出力するために、& (アドレス)演算子を利用しています。これらのメモリアドレスはスタックメモリ上にあることに注意してください。

#include <iostream>
#include <vector>

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

constexpr int WIDTH = 8;

int main() {
  int *pointers_vec[WIDTH];

  cout << "pointers_vec addresses:" << endl;
  for (auto &i : pointers_vec) {
    cout << &i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

pointers_vec addresses:
0x7ffecd7a00d0
0x7ffecd7a00d8
0x7ffecd7a00e0
0x7ffecd7a00e8
0x7ffecd7a00f0
0x7ffecd7a00f8
0x7ffecd7a0100
0x7ffecd7a0108

new 演算子を使って C++ のダイナミックメモリ上にポインタのベクトルを作成する

一方、ヒープ上に動的に割り当てられたポインタのベクトルを作成するために new 演算子を利用することもできます。

この解決策では、プログラムが終了する前にプログラマがメモリを解放する必要があります。そうしないと、コードはメモリリークに悩まされることになります。動的に割り当てられたベクトルの各位置をクリーンアップするために delete [] 記法を使用していることに注意してください。

#include <iostream>
#include <vector>

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

constexpr int WIDTH = 8;

int main() {
  int *vector_of_pointers = new int[WIDTH];

  cout << "vector_of_pointers addresses:" << endl;
  for (int i = 0; i < WIDTH; ++i) {
    cout << &vector_of_pointers[i] << endl;
  }
  cout << endl;

  delete[] vector_of_pointers;
  return EXIT_SUCCESS;
}

出力:

vector_of_pointers addresses:
0x2561c20
0x2561c28
0x2561c30
0x2561c38
0x2561c40
0x2561c48
0x2561c50
0x2561c58

C++ で std::vector コンテナを用いてポインタのベクトルを作成する

std::vector は、複数の組み込み関数を用いてポインタのベクトルを確保したり、ベクトルを操作したりするための豊富な機能を提供します。このメソッドは実行時に新しい要素を生成するためのより柔軟なインタフェースを提供します。次の例のように、ベクトルの要素を nullptr の値で初期化していることに注意してください。

#include <iostream>
#include <vector>

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

constexpr int WIDTH = 8;

int main() {
  vector<int *> vector_p(WIDTH, nullptr);

  cout << "vector_p addresses:" << endl;
  for (int i = 0; i < WIDTH; ++i) {
    cout << &vector_p[i] << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

vector_p addresses:
0x1255c20
0x1255c28
0x1255c30
0x1255c38
0x1255c40
0x1255c48
0x1255c50
0x1255c58
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Pointer