Crea vettore di puntatori in C++

Jinku Hu 12 ottobre 2023
  1. Usa la notazione [] per creare un vettore di puntatori in C++
  2. Usa il new operatore per creare vettori di puntatori sulla memoria dinamica in C++
  3. Usa il contenitore std::vector per creare un vettore di puntatori in C++
Crea vettore di puntatori in C++

Questo articolo spiegherà diversi metodi su come creare un vettore di puntatori in C++.

Usa la notazione [] per creare un vettore di puntatori in C++

Poiché i tipi di puntatori possono essere modificati facilmente, useremo int * nei seguenti esempi per dichiarare un vettore di puntatori. In alternativa, possiamo usare il puntatore void * se richiedi un tipo di indirizzo generico per memorizzare strutture dati opache o, al contrario, utilizzare un puntatore a una classe definita dall’utente.

Questa soluzione utilizza una notazione di array in stile C - [] che dichiara un array di lunghezza fissa. È simile alla normale dichiarazione di array, ma in questo caso siamo interessati ad accedere agli indirizzi di ogni elemento. Stiamo usando l’operatore & (indirizzo di) per accedere ai puntatori nel vettore e stamparli sulla console. Notare che questi indirizzi di memoria si trovano nella memoria dello stack.

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

Produzione:

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

Usa il new operatore per creare vettori di puntatori sulla memoria dinamica in C++

D’altra parte, possiamo utilizzare l’operatore new per creare un vettore di puntatori allocati dinamicamente sull’heap.

Questa soluzione richiede che il programmatore liberi la memoria prima che il programma esca; in caso contrario, il codice subirà la perdita di memoria, che può essere un problema enorme nelle applicazioni a esecuzione prolungata e negli ambienti hardware con risorse limitate. Nota che usiamo la notazione delete [] per ripulire ogni posizione in un vettore allocato dinamicamente.

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

Produzione:

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

Usa il contenitore std::vector per creare un vettore di puntatori in C++

std::vector offre ricche funzionalità per allocare un vettore di puntatori e manipolare il vettore con molteplici funzioni incorporate. Questo metodo fornisce un’interfaccia più flessibile per la creazione di nuovi elementi durante il runtime. Si noti che abbiamo inizializzato gli elementi vettoriali con il valore nullptr, come mostrato nell’esempio seguente.

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

Produzione:

vector_p addresses:
0x1255c20
0x1255c28
0x1255c30
0x1255c38
0x1255c40
0x1255c48
0x1255c50
0x1255c58
Autore: 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

Articolo correlato - C++ Pointer