Crear un vector de punteros en C++

Jinku Hu 12 octubre 2023
  1. Utiliza la [] Notación para crear un vector de punteros en C++
  2. Use el operador new para crear el vector de punteros en la memoria dinámica en C++
  3. Use el contenedor std::vector para crear un vector de punteros en C++
Crear un vector de punteros en C++

Este artículo explicará varios métodos de cómo crear un vector de punteros en C++.

Utiliza la [] Notación para crear un vector de punteros en C++

Como los tipos de punteros pueden ser modificados fácilmente, usaremos int * en los siguientes ejemplos para declarar un vector de punteros. Alternativamente, podemos usar el puntero evitar * si se requiere un tipo de dirección genérica para almacenar estructuras de datos opacas o, por el contrario, usar un puntero a una clase definida a medida.

Esta solución utiliza una notación de array de estilo C - [] que declara un array de longitud fija. Es similar a la declaración del array regular, pero en este caso, estamos interesados en acceder a las direcciones de cada elemento. Estamos usando el operador & (dirección de) para acceder a los punteros en el vector e imprimirlos en la consola. Nótese que estas direcciones de memoria están localizadas en la memoria de la pila.

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

Resultado:

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

Use el operador new para crear el vector de punteros en la memoria dinámica en C++

Por otro lado, podemos utilizar el operador new para crear un vector de punteros asignados dinámicamente en el montón.

Esta solución requiere que el programador libere la memoria antes de que el programa salga; de lo contrario, el código sufrirá la fuga de memoria, lo que puede ser un problema masivo en aplicaciones de larga duración y entornos de hardware con recursos limitados. Observe que usamos la notación delete [] para limpiar cada ubicación en un vector asignado dinámicamente.

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

Resultado:

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

Use el contenedor std::vector para crear un vector de punteros en C++

std::vector ofrece una rica funcionalidad para asignar un vector de punteros y manipular el vector con múltiples funciones incorporadas. Este método proporciona una interfaz más flexible para la creación de nuevos elementos durante el tiempo de ejecución. Note que inicializamos los elementos del vector con el valor nullptr, como se muestra en el siguiente ejemplo.

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

Resultado:

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

Artículo relacionado - C++ Pointer