Zurückgeben einer 2D-Anordnung aus einer Funktion in C++
- Verwenden der Zeiger-Notation zur Rückgabe eines 2D-Arrays aus einer Funktion in C++
- Verwenden Sie die Zeiger-zu-Zeiger-Notation, um ein 2D-Array von einer Funktion in C++ zurückzugeben
Dieser Artikel führt ein, wie man ein 2D-Array von einer Funktion in C++ zurückgibt.
Verwenden der Zeiger-Notation zur Rückgabe eines 2D-Arrays aus einer Funktion in C++
Die Rückgabe durch den Zeiger ist die bevorzugte Methode für größere Objekte, anstatt sie nach Wert zurückzugeben. Da das 2D-Array ziemlich groß werden kann, ist es am besten, den Zeiger
an das erste Element der Matrix zu übergeben, wie im folgenden Code-Beispiel gezeigt wird. Beachten Sie, dass der Parameter für das 2D-Array in ModifyArr
mit der Notation arr[][SIZE]
definiert wird, um auf seine Elemente mit Klammern im Funktionsumfang zuzugreifen.
#include <iomanip>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
constexpr int SIZE = 4;
int *ModifyArr(int arr[][SIZE], int len) {
for (int i = 0; i < len; ++i) {
for (int j = 0; j < len; ++j) {
arr[i][j] *= 2;
}
}
return reinterpret_cast<int *>(arr);
}
int main() {
int c_array[SIZE][SIZE] = {
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
cout << "input array\n";
for (auto &i : c_array) {
cout << " [ ";
for (int j : i) {
cout << setw(2) << j << ", ";
}
cout << "]" << endl;
}
cout << endl;
int *ptr = ModifyArr(c_array, SIZE);
cout << "modified array\n";
for (int i = 0; i < SIZE; ++i) {
cout << " [ ";
for (int j = 0; j < SIZE; ++j) {
cout << setw(2) << *(ptr + (i * SIZE) + j) << ", ";
}
cout << "]" << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
input array
[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16, ]
modified array
[ 2, 4, 6, 8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
Verwenden Sie die Zeiger-zu-Zeiger-Notation, um ein 2D-Array von einer Funktion in C++ zurückzugeben
Als Alternative kann man einen Zeiger auf Zeiger-Notation verwenden, um das Array von der Funktion zurückzugeben. Diese Methode hat einen Vorteil gegenüber anderen, wenn die zurückzugebenden Objekte dynamisch zugewiesen werden. Normalerweise sollte man den Elementzugriffsausdruck modifizieren, sobald der Zeiger im Caller-Bereich zurückgegeben wird. Beachten Sie, dass wir die Array-Adresse auf int*
casten und dann die Dereferenz, um die Werte zu erhalten.
#include <iomanip>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
constexpr int SIZE = 4;
int **ModifyArr2(int *arr, int len) {
for (int i = 0; i < len; ++i) {
for (int j = 0; j < len; ++j) *(arr + (i * len) + j) *= 2;
}
return reinterpret_cast<int **>(arr);
}
int main() {
int c_array[SIZE][SIZE] = {
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
cout << "input array\n";
for (auto &i : c_array) {
cout << " [ ";
for (int j : i) {
cout << setw(2) << j << ", ";
}
cout << "]" << endl;
}
cout << endl;
int **ptr2 = ModifyArr2(c_array[0], SIZE);
cout << "modified array\n";
for (int i = 0; i < SIZE; ++i) {
cout << " [ ";
for (int j = 0; j < SIZE; ++j) {
cout << setw(2) << *((int *)ptr2 + (i * SIZE) + j) << ", ";
}
cout << "]" << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
input array
[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16, ]
modified array
[ 2, 4, 6, 8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
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