C++ 中指向陣列的指標

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用指向陣列的指標交換不同陣列中的元素
  2. 在 C++ 中使用陣列引用將二維陣列傳遞給一個函式
C++ 中指向陣列的指標

本文將介紹如何在 C++ 中使用指向陣列的指標的多種方法。

在 C++ 中使用指向陣列的指標交換不同陣列中的元素

指標是低階程式設計的核心元素之一。即使 C++ 試圖用引用替換其某些用例,但指標仍然只是內建資料型別,可用於直接處理記憶體。請注意,C 風格的陣列本質上是指向起始元素的指標,並且由於它具有固定大小,因此編譯器會在內部自動處理使用 [] 表示法的訪問。在下面的示例程式碼中,我們實現了一個函式,該函式交換來自不同整數陣列的兩個元素。注意,函式原型使用兩個 int*指標來表示需要交換的元素。指標使直接訪問給定元素的儲存位置成為可能,而不僅僅是修改元素的本地例項。

#include <iostream>

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

constexpr int SIZE = 4;

void swapArrayElements(int* e1, int* e2) {
  int z = *e1;
  *e1 = *e2;
  *e2 = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(&arr1[0], &arr2[3]);
  printArray(arr1);
  printArray(arr2);
  cout << endl;

  return EXIT_SUCCESS;
}

輸出:

11, 42, 53, 44,
10, 21, 30, 99,

99, 42, 53, 44,
10, 21, 30, 11,

另外,我們可以分別傳遞陣列指標和元素位置。該方法本質上並不比以前的方法更好,但是這裡是為了演示可以使用指向陣列的指標的不同語言符號。在這種情況下,將新增兩個函式引數以指定需要交換的元素的位置。同時,元素訪問是使用所謂的指標算術完成的,它可能具有非常繁瑣的表示法。請注意,將指向陣列的指標增加一個整數值等於將指向一個元素型別的指標增加,這會將指標值移動物件型別的 sizeof 位元組。

#include <iostream>

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

constexpr int SIZE = 4;

void swapArrayElements(int* arr1, int e1, int* arr2, int e2) {
  int z = *(arr1 + e1);
  *(arr1 + e1) = *(arr2 + e2);
  *(arr2 + e2) = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(arr1, 1, arr2, 2);
  printArray(arr1);
  printArray(arr2);
  cout << endl;
}

輸出:

99, 42, 53, 44,
10, 21, 30, 11,

99, 30, 53, 44,
10, 21, 42, 11,

在 C++ 中使用陣列引用將二維陣列傳遞給一個函式

傳遞二維 C 風格的陣列可能很難看,因此最好使用引用符號代替。請注意,以下示例函式將適用於預定義的長度大小的陣列,以便函式原型包括每個維的大小值。從好的方面來看,這使利用基於範圍的 for 迴圈進行元素遍歷成為可能。

#include <iomanip>
#include <iostream>

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

constexpr int SIZE = 4;

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

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

  return EXIT_SUCCESS;
}

輸出:

[  1,  2,  3,  4, ]
[  5,  6,  7,  8, ]
[  9, 10, 11, 12, ]
[ 13, 14, 15, 16, ]

[  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++ Pointer