在 C++ 中按引用傳遞引數與按指標傳遞引數的比較

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用&variable 表示法通過引用傳遞函式引數
  2. 在 C++ 中使用*variable 符號通過引用傳遞函式引數
  3. 使用 (&array_variable)[x][y] 表示法通過 C++ 中的引用傳遞 2D 陣列
在 C++ 中按引用傳遞引數與按指標傳遞引數的比較

本文將介紹幾種在 C++ 中通過引用傳遞引數與通過指標傳遞引數的方法。

在 C++ 中使用&variable 表示法通過引用傳遞函式引數

傳遞引數是函式的最常見功能,可為不同程式碼塊之間的資料交換提供靈活的介面。每次呼叫函式時,都會通過傳遞的引數來建立和初始化其引數。通常,為傳遞引數而區分兩種方法:按值傳遞和按引用傳遞,後者使引數成為相應引數的別名。在下面的示例中,我們演示一個基本的整數交換函式,其中引數由引用傳遞,並使用 int &var 表示法。當 swapIntegers 函式返回時,main 函式範圍內的 int 物件被修改。

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

輸出:

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

在 C++ 中使用*variable 符號通過引用傳遞函式引數

可以使用指標來實現與上一個示例相似的行為。請注意,指標是物件的地址,可以使用*運算子對其進行取消引用以訪問物件的值。使用指標傳遞引數意味著我們可以從函式範圍訪問給定物件並修改其值,以便在返回後保留狀態。請注意,要傳遞指向函式的指標,需要使用地址操作符(&)進行訪問。

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

輸出:

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

使用 (&array_variable)[x][y] 表示法通過 C++ 中的引用傳遞 2D 陣列

有時將二維 C 語言樣式陣列引用傳遞給該函式可能很方便,但是這種表示方式有點不直觀,可能導致錯誤的結果。如果我們有一個帶有任意 SIZE 維的整數陣列,則可以從函式引數中使用以下表示法引用它-int (&arr)[SIZE][SIZE]。注意,缺少括號 () 將被解釋為對 int 物件的引用陣列,並導致編譯錯誤。

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

輸出:

[  2,  4,  6,  8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Function