Puntatore a un array in C++

Jinku Hu 12 ottobre 2023
  1. Usa il puntatore a un array per scambiare elementi in array diversi in C++
  2. Utilizzare Array Reference per passare array 2D a una funzione in C++
Puntatore a un array in C++

Questo articolo illustrerà più metodi su come utilizzare un puntatore a una matrice in C++.

Usa il puntatore a un array per scambiare elementi in array diversi in C++

Il puntatore è uno degli elementi centrali della programmazione di basso livello. Anche se C++ cerca di sostituire alcuni dei loro casi d’uso con riferimenti, i puntatori sono ancora solo tipi di dati incorporati che possono essere utilizzati per gestire direttamente la memoria. Si noti che l’array in stile C è essenzialmente un puntatore all’elemento iniziale e poiché ha un compilatore di dimensioni fisse gestisce automaticamente gli accessi con la notazione [] internamente. Nel seguente codice di esempio, implementiamo una funzione che scambia due elementi da diversi array di interi. Si noti che il prototipo della funzione richiede due puntatori int* per indicare gli elementi che devono essere scambiati. Il puntatore rende possibile accedere direttamente alla posizione di memoria degli elementi dati invece di limitarsi a modificare le istanze locali degli elementi.

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

Produzione:

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

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

In alternativa, possiamo passare separatamente i puntatori di array e le posizioni degli elementi. Questo metodo non è intrinsecamente migliore del precedente, ma è qui per dimostrare le diverse notazioni del linguaggio con cui può essere utilizzato un puntatore a un array. In questo caso, vengono aggiunti due argomenti di funzione per specificare la posizione degli elementi che devono essere scambiati. Nel frattempo, l’accesso agli elementi avviene utilizzando la cosiddetta aritmetica del puntatore, che può avere una notazione piuttosto ingombrante. Notare che incrementare il puntatore all’array di un valore intero equivale a incrementare il puntatore a un tipo di elemento, che sposta il valore del puntatore di byte sizeof del tipo di oggetto.

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

Produzione:

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

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

Utilizzare Array Reference per passare array 2D a una funzione in C++

Il passaggio degli array bidimensionali in stile C può diventare piuttosto brutto, quindi è preferibile utilizzare invece la notazione di riferimento. Tuttavia, le seguenti funzioni di esempio sarebbero adatte per array di dimensioni predefinite in modo che il prototipo della funzione includa il valore della dimensione per ciascuna dimensione. Al rialzo, questo offre la possibilità di utilizzare un cicli for basato su intervallo per l’attraversamento degli elementi.

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

Produzione:

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