Zeiger auf ein Array in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie den Zeiger auf ein Array, um Elemente in verschiedenen Arrays in C++ auszutauschen
  2. Verwenden Sie die Array-Referenz, um ein 2D-Array an eine Funktion in C++ zu übergeben
Zeiger auf ein Array in C++

Dieser Artikel zeigt verschiedene Methoden zur Verwendung eines Zeigers auf ein Array in C++.

Verwenden Sie den Zeiger auf ein Array, um Elemente in verschiedenen Arrays in C++ auszutauschen

Der Zeiger ist eines der Kernelemente der Low-Level-Programmierung. Obwohl C++ versucht, einige ihrer Anwendungsfälle durch Referenzen zu ersetzen, sind Zeiger immer noch nur integrierte Datentypen, die zur direkten Verarbeitung des Speichers verwendet werden können. Beachten Sie, dass das Array im C-Stil im Wesentlichen ein Zeiger auf das Startelement ist und da es über einen Compiler mit fester Größe verfügt, werden Zugriffe automatisch mit der Notation [] intern verarbeitet. Im folgenden Beispielcode implementieren wir eine Funktion, die zwei Elemente aus verschiedenen Integer-Arrays austauscht. Beachten Sie, dass der Funktionsprototyp zwei int*-Zeiger benötigt, um die Elemente zu kennzeichnen, die ausgetauscht werden müssen. Der Zeiger ermöglicht den direkten Zugriff auf den Speicherort der angegebenen Elemente, anstatt lediglich die lokalen Instanzen der Elemente zu ändern.

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

Ausgabe:

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

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

Alternativ können wir Array-Zeiger und Elementpositionen separat übergeben. Diese Methode ist von Natur aus nicht besser als die vorherige, dient jedoch dazu, die verschiedenen Sprachnotationen zu demonstrieren, mit denen ein Zeiger auf ein Array verwendet werden kann. In diesem Fall werden zwei Funktionsargumente hinzugefügt, um die Position der Elemente anzugeben, die ausgetauscht werden müssen. In der Zwischenzeit erfolgt der Elementzugriff über die sogenannte Zeigerarithmetik, die eine recht umständliche Notation haben kann. Beachten Sie, dass das Inkrementieren des Zeigers auf das Array um einen ganzzahligen Wert dem Inkrementieren des Zeigers auf einen Elementtyp entspricht, der den Zeigerwert um die Bytes sizeof des Objekttyps verschiebt.

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

Ausgabe:

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

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

Verwenden Sie die Array-Referenz, um ein 2D-Array an eine Funktion in C++ zu übergeben

Das Übergeben der zweidimensionalen Arrays im C-Stil kann ziemlich hässlich werden. Daher ist es vorzuziehen, stattdessen die Referenznotation zu verwenden. Beachten Sie jedoch, dass die folgenden Beispielfunktionen für vordefinierte Arrays mit Längengröße geeignet sind, sodass der Funktionsprototyp den Größenwert für jede Dimension enthält. Auf der anderen Seite bietet dies die Möglichkeit, eine bereichsbasierte for-Schleife für die Elementdurchquerung zu verwenden.

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

Ausgabe:

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