Passar argumento por referência vs por ponteiro em C++

Jinku Hu 12 outubro 2023
  1. Use a notação &variable para passar argumentos da função por referência em C++
  2. Use a notação *variable para passar argumentos da função por referência em C++
  3. Use (&array_variable)[x][y] Notação para passar array 2D por referência em C++
Passar argumento por referência vs por ponteiro em C++

Este artigo irá explicar vários métodos de passar um argumento pela referência versus passar pelo ponteiro em C++.

Use a notação &variable para passar argumentos da função por referência em C++

Passar argumentos é o recurso mais comum de funções para fornecer uma interface flexível para troca de dados entre diferentes blocos de código. Cada vez que a função é chamada, seus parâmetros são criados e inicializados pelos argumentos que foram passados. Geralmente, dois métodos são diferenciados para passagem de argumento: passado por valor e passado por referência, o último dos quais faz com que o parâmetro seja um apelido para o argumento correspondente. Demonstramos uma função de troca de inteiro básico no exemplo a seguir, onde os argumentos são passados ​​por referências e a notação int &var é usada. Quando a função swapIntegers retorna, os objetos int no escopo da função main são modificados.

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

Resultado:

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

Use a notação *variable para passar argumentos da função por referência em C++

Comportamento semelhante ao exemplo anterior pode ser implementado usando ponteiros. Observe que um ponteiro é um endereço do objeto e pode ser desreferenciado com o operador * para acessar o valor do objeto. Passar os argumentos usando o ponteiro significa que podemos acessar os objetos fornecidos do escopo da função e modificar seus valores para que o estado seja preservado após o retorno. Observe que, para passar ponteiros para a função, eles precisam ser acessados ​​usando o operador address-of (&).

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

Resultado:

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

Use (&array_variable)[x][y] Notação para passar array 2D por referência em C++

Às vezes, pode ser útil passar uma referência de array bidimensional no estilo C para a função, mas a notação é ligeiramente não intuitiva e pode levar a resultados errôneos. Se tivermos um array de inteiros com as dimensões arbitrárias SIZE, ela pode ser referenciada a partir do parâmetro de função com a seguinte notação - int (&arr)[SIZE][SIZE]. Lembre-se de que, se faltar o parêntese (), será interpretado como o array de referências a objetos int e resultará em erro de compilação.

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

Resultado:

[  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

Artigo relacionado - C++ Function