Puntero a un array en C++

Jinku Hu 12 octubre 2023
  1. Use el puntero a un array para intercambiar elementos en diferentes matrices en C++
  2. Utilice la referencia de array para pasar un array 2D a una función en C++
Puntero a un array en C++

Este artículo mostrará varios métodos sobre cómo usar un puntero a un array en C++.

Use el puntero a un array para intercambiar elementos en diferentes matrices en C++

El puntero es uno de los elementos centrales de la programación de bajo nivel. Aunque C++ intenta sustituir algunos de sus casos de uso con referencias, los punteros siguen siendo solo tipos de datos integrados que se pueden utilizar para manejar la memoria directamente. Tenga en cuenta que el array de estilo C es esencialmente un puntero al elemento inicial y, dado que tiene un compilador de tamaño fijo, maneja automáticamente los accesos con notación [] internamente. En el siguiente código de ejemplo, implementamos una función que intercambia dos elementos de diferentes matrices de enteros. Observe que el prototipo de la función toma dos punteros int* para indicar los elementos que deben intercambiarse. El puntero permite acceder a la ubicación de memoria de los elementos dados directamente en lugar de simplemente modificar las instancias locales de los elementos.

#include <iostream>

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

constexpr int SIZE = 4;

void swapArrayElements(int* e1, int* e2) {
  int z = *e1;
  *e1 = *e2;
  *e2 = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(&arr1[0], &arr2[3]);
  printArray(arr1);
  printArray(arr2);
  cout << endl;

  return EXIT_SUCCESS;
}

Producción :

11, 42, 53, 44,
10, 21, 30, 99,

99, 42, 53, 44,
10, 21, 30, 11,

Alternativamente, podemos pasar punteros de array y posiciones de elementos por separado. Este método no es intrínsecamente mejor que el anterior, pero está aquí para demostrar las diferentes notaciones del lenguaje mediante las cuales se puede utilizar un puntero a un array. En este caso, se agregan dos argumentos de función para especificar la posición de los elementos que deben intercambiarse. Mientras tanto, el acceso a los elementos se realiza mediante la llamada aritmética de punteros, que puede tener una notación bastante engorrosa. Tenga en cuenta que incrementar el puntero a el array en un valor entero es igual a incrementar el puntero a un tipo de elemento, lo que mueve el valor del puntero en el sizeof bytes del tipo de objeto.

#include <iostream>

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

constexpr int SIZE = 4;

void swapArrayElements(int* arr1, int e1, int* arr2, int e2) {
  int z = *(arr1 + e1);
  *(arr1 + e1) = *(arr2 + e2);
  *(arr2 + e2) = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(arr1, 1, arr2, 2);
  printArray(arr1);
  printArray(arr2);
  cout << endl;
}

Producción :

99, 42, 53, 44,
10, 21, 30, 11,

99, 30, 53, 44,
10, 21, 42, 11,

Utilice la referencia de array para pasar un array 2D a una función en C++

Pasar las matrices bidimensionales de estilo C puede resultar bastante feo, por lo que es preferible utilizar la notación de referencia. Sin embargo, tenga en cuenta que las siguientes funciones de ejemplo serían adecuadas para matrices de tamaño de longitud predefinidas, de modo que el prototipo de función incluya el valor de tamaño para cada dimensión. Por el lado positivo, esto brinda la posibilidad de utilizar un bucle for basado en el rango para el recorrido del elemento.

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

constexpr int SIZE = 4;

void MultiplyArrayByTwo(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    for (int& j : i) j *= 2;
  }
}

void printArray(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
}

int main() {
  int array_2d[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
  printArray(array_2d);
  MultiplyArrayByTwo(array_2d);
  cout << endl;
  printArray(array_2d);

  return EXIT_SUCCESS;
}

Producción :

[  1,  2,  3,  4, ]
[  5,  6,  7,  8, ]
[  9, 10, 11, 12, ]
[ 13, 14, 15, 16, ]

[  2,  4,  6,  8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
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