Erstellen eines Vektors von Zeigern in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden der [] Notation zum Erstellen eines Vektors von Zeigern in C++
  2. Verwenden des new-Operators zum Erstellen eines Vektors von Zeigern auf dynamischen Speicher in C++
  3. Verwenden des Containers std::vector zum Erstellen von Zeigervektoren in C++
Erstellen eines Vektors von Zeigern in C++

In diesem Artikel werden verschiedene Methoden erläutert, wie ein Vektor von Zeigern in C++ erstellt werden kann.

Verwenden der [] Notation zum Erstellen eines Vektors von Zeigern in C++

Da die Zeigertypen leicht geändert werden können, werden wir in den folgenden Beispielen int * verwenden, um einen Vektor von Zeigern zu deklarieren. Alternativ können wir den Zeigertyp void * verwenden, wenn Sie einen generischen Adresstyp benötigen, um undurchsichtige Datenstrukturen zu speichern, oder im Gegenteil einen Zeiger auf eine benutzerdefinierte Klasse verwenden.

Diese Lösung verwendet eine C-ähnliche Array-Notation - [], die ein Array mit fester Länge deklariert. Es ist ähnlich wie die reguläre Array-Deklaration, aber in diesem Fall sind wir daran interessiert, auf die Adressen der einzelnen Elemente zuzugreifen. Wir verwenden den Operator & (Adresse von), um auf Zeiger im Vektor zuzugreifen und auf der Konsole auszugeben. Beachten Sie, dass sich diese Speicheradressen auf dem Stapelspeicher befinden.

#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;
}

Ausgabe:

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

Verwenden des new-Operators zum Erstellen eines Vektors von Zeigern auf dynamischen Speicher in C++

Auf der anderen Seite können wir den new-Operator verwenden, um einen Vektor von Zeigern zu erzeugen, die dynamisch auf dem Heap alloziert werden.

Bei dieser Lösung muss der Programmierer den Speicher freigeben, bevor das Programm beendet wird; andernfalls leidet der Code unter dem Speicherleck, was bei lang laufenden Anwendungen und ressourcenbeschränkten Hardwareumgebungen ein massives Problem darstellen kann. Beachten Sie, dass wir die Notation delete [] verwenden, um jede Stelle in einem dynamisch zugewiesenen Vektor zu bereinigen.

#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;
}

Ausgabe:

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

Verwenden des Containers std::vector zum Erstellen von Zeigervektoren in C++

std::vector bietet eine umfangreiche Funktionalität, um einen Vektor von Zeigern zu allozieren und den Vektor mit mehreren eingebauten Funktionen zu manipulieren. Diese Methode bietet eine flexiblere Schnittstelle für die Erstellung neuer Elemente während der Laufzeit. Beachten Sie, dass wir die Vektorelemente mit dem Wert nullptr initialisiert haben, wie im folgenden Beispiel gezeigt.

#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;
}

Ausgabe:

vector_p addresses:
0x1255c20
0x1255c28
0x1255c30
0x1255c38
0x1255c40
0x1255c48
0x1255c50
0x1255c58
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Pointer