Argumentübergabe per Referenz vs. Übergabe per Zeiger in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden der &variablen-Notation zur Übergabe von Funktionsargumenten per Referenz in C++
  2. Verwendung der *variable-Notation zur Übergabe von Funktionsargumenten per Referenz in C++
  3. Verwenden der (&array_variable)[x][y] Notation zur Übergabe eines 2D-Arrays per Referenz in C++
Argumentübergabe per Referenz vs. Übergabe per Zeiger in C++

In diesem Artikel werden verschiedene Methoden zum Übergeben eines Arguments durch die Referenz im Vergleich zum Übergeben durch den Zeiger in C++ erläutert.

Verwenden der &variablen-Notation zur Übergabe von Funktionsargumenten per Referenz in C++

Das Übergeben von Argumenten ist das häufigste Merkmal von Funktionen, um eine flexible Schnittstelle für den Datenaustausch zwischen verschiedenen Codeblöcken bereitzustellen. Bei jedem Aufruf der Funktion werden ihre Parameter durch die übergebenen Argumente erstellt und initialisiert. Im Allgemeinen werden zwei Methoden für die Argumentübergabe unterschieden: Übergeben als Wert und Übergeben als Referenz, wobei letztere bewirkt, dass der Parameter ein Alias ​​für das entsprechende Argument ist. Im folgenden Beispiel wird eine grundlegende Ganzzahl-Swap-Funktion demonstriert, bei der Argumente von Referenzen übergeben werden und die Notation int &var verwendet wird. Wenn die Funktion swapIntegers zurückkehrt, werden die Objekte int im Funktionsumfang main geändert.

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

Ausgabe:

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

Verwendung der *variable-Notation zur Übergabe von Funktionsargumenten per Referenz in C++

Ein ähnliches Verhalten wie im vorherigen Beispiel kann mithilfe von Zeigern implementiert werden. Beachten Sie, dass ein Zeiger eine Adresse des Objekts ist und mit dem Operator * dereferenziert werden kann, um auf den Objektwert zuzugreifen. Wenn Sie die Argumente mit dem Zeiger übergeben, können Sie vom Funktionsbereich aus auf die angegebenen Objekte zugreifen und deren Werte so ändern, dass der Status nach der Rückgabe erhalten bleibt. Beachten Sie, dass zum Übergeben von Zeigern an die Funktion mit dem Operator address-of (&) auf sie zugegriffen werden muss.

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

Ausgabe:

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

Verwenden der (&array_variable)[x][y] Notation zur Übergabe eines 2D-Arrays per Referenz in C++

Manchmal kann es praktisch sein, eine zweidimensionale Array-Referenz im C-Stil an die Funktion zu übergeben, aber die Notation ist etwas nicht intuitiv und kann zu fehlerhaften Ergebnissen führen. Wenn wir ein Array von ganzen Zahlen mit den beliebigen Dimensionen SIZE haben, kann auf den Funktionsparameter mit der folgenden Notation verwiesen werden: int (&arr)[SIZE][SIZE]. Beachten Sie, dass das Fehlen der Klammer () als Array von Verweisen auf int-Objekte interpretiert wird und zu Kompilierungsfehlern führt.

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

Ausgabe:

[  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

Verwandter Artikel - C++ Function