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

Jinku Hu 12 octubre 2023
  1. Utilice la notación &variable para pasar argumentos de función por referencia en C++
  2. Utilice la notación *variable para pasar argumentos de función por referencia en C++
  3. Utilice la notación (&array_variable)[x][y] para pasar un array 2D por referencia en C++
Pasar un argumento por referencia frente a un 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, ]
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++ Function