Restituisci array 2D dalla funzione in C++

Jinku Hu 12 ottobre 2023
  1. Usa la notazione puntatore per restituire un array 2D dalla funzione in C++
  2. Usa la notazione Pointer to Pointer per restituire un array 2D dalla funzione in C++
Restituisci array 2D dalla funzione in C++

Questo articolo introdurrà come restituire un array 2D da una funzione in C++.

Usa la notazione puntatore per restituire un array 2D dalla funzione in C++

La restituzione tramite il puntatore è il metodo preferito per oggetti più grandi piuttosto che restituirli per valore. Poiché l’array 2D può diventare abbastanza grande, è meglio passare il puntatore al primo elemento di un array, come dimostrato nel seguente esempio di codice. Notare che il parametro per array 2D in ModifyArr è definito con la notazione arr[][SIZE] per accedere ai suoi elementi tra parentesi nell’ambito della funzione.

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

Produzione:

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, ]

Usa la notazione Pointer to Pointer per restituire un array 2D dalla funzione in C++

In alternativa, possiamo usare un puntatore alla notazione del puntatore per restituire l’array dalla funzione. Questo metodo ha un vantaggio rispetto ad altri se gli oggetti da restituire vengono allocati dinamicamente. Di solito, si dovrebbe modificare l’espressione di accesso all’elemento una volta che il puntatore viene restituito nell’ambito del chiamante. Si noti che eseguiamo il cast dell’indirizzo dell’array su int* e quindi dereferenziamo per ottenere i valori.

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

Produzione:

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, ]
Autore: 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

Articolo correlato - C++ Array