HOWTO · C++

Pasar un argumento por referencia frente a un puntero en C++

Este artículo demuestra cómo pasar por referencia frente a pasar por puntero en C++

Este artículo explicará varios métodos de pasar un argumento por la referencia frente a pasar por el puntero en C++.

Utilice la notación &variable para pasar argumentos de función por referencia en C++

Pasar argumentos es la característica más común de las funciones para proporcionar una interfaz flexible para el intercambio de datos entre diferentes bloques de código. Cada vez que se invoca una función, sus parámetros son creados e inicializados por los argumentos que se pasaron. Generalmente, se diferencian dos métodos para el paso de argumentos: pasado por valor y pasado por referencia, el último de los cuales hace que el parámetro sea un alias para el argumento correspondiente. Demostramos una función básica de intercambio de enteros en el siguiente ejemplo, donde los argumentos se pasan por referencias y se usa la notación int &var. Cuando la función swapIntegers regresa, los objetos int en el alcance de la función main se modifican.

#include <iostream>

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

void swapIntegers(int& x, int& y) {
  int z = x;
  x = y;
  y = z;
}

int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";

  cout << "Swapping a and b ...\n";
  swapIntegers(a, b);

  cout << "a = " << a << " b = " << b << "\n";

  return EXIT_SUCCESS;
}

Producción :

a = 45 b = 35
Swapping a and b ...
a = 35 b = 45

Utilice la notación *variable para pasar argumentos de función por referencia en C++

Se puede implementar un comportamiento similar al del ejemplo anterior usando punteros. Tenga en cuenta que un puntero es una dirección del objeto y se puede desreferenciar con el operador * para acceder al valor del objeto. Pasar los argumentos usando el puntero significa que podemos acceder a los objetos dados desde el alcance de la función y modificar sus valores para que el estado se conserve después de la devolución. Tenga en cuenta que, para pasar punteros a la función, es necesario acceder a ellos mediante el operador de dirección de (&).

#include <iomanip>
#include <iostream>

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

void swapIntegers2(int* x, int* y) {
  int z = *x;
  *x = *y;
  *y = z;
}

int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";

  cout << "Swapping a and b ...\n";
  swapIntegers2(&a, &b);

  cout << "a = " << a << " b = " << b << "\n";

  return EXIT_SUCCESS;
}

Producción :

a = 45 b = 35
Swapping a and b ...
a = 35 b = 45

Utilice la notación (&array_variable)[x][y] para pasar un array 2D por referencia en C++

A veces puede ser útil pasar una referencia de array de estilo C bidimensional a la función, pero la notación no es intuitiva y podría dar lugar a resultados erróneos. Si tenemos un array de enteros con las dimensiones arbitrarias SIZE, se puede hacer referencia al parámetro de función con la siguiente notación: int (&arr)[SIZE][SIZE]. Tenga en cuenta que, si falta el paréntesis () se interpretará como un array de referencias a objetos int y resultará en un error de compilación.

#include <iomanip>
#include <iostream>

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

void MultiplyArrayByTwoV2(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;
  }
}

constexpr int SIZE = 4;

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

  MultiplyArrayByTwoV2(array_2d);
  printArray(array_2d);

  return EXIT_SUCCESS;
}

Producción :

[  2,  4,  6,  8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]