Ponteiro para um array em C++

Jinku Hu 12 outubro 2023
  1. Use o ponteiro para um array para trocar elementos em diferentes arrays em C++
  2. Use a referência de array para passar matriz 2D para uma função em C++
Ponteiro para um array em C++

Este artigo demonstrará vários métodos sobre como usar um ponteiro para um array em C++.

Use o ponteiro para um array para trocar elementos em diferentes arrays em C++

O ponteiro é um dos principais elementos da programação de baixo nível. Mesmo que o C++ tente substituir alguns de seus casos de uso por referências, os ponteiros ainda são apenas tipos de dados embutidos que podem ser utilizados para manipular a memória diretamente. Observe que, o array estilo C é essencialmente um ponteiro para o elemento inicial e, como tem um compilador de tamanho fixo, trata automaticamente os acessos com a notação [] internamente. No código de exemplo a seguir, implementamos uma função que troca dois elementos de diferentes matrizes de inteiros. Observe que o protótipo da função leva dois ponteiros int* para denotar os elementos que precisam ser trocados. O ponteiro torna possível acessar o local da memória dos elementos fornecidos diretamente, em vez de simplesmente modificar as instâncias locais dos elementos.

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

Resultado:

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

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

Como alternativa, podemos passar ponteiros de array e posições de elementos separadamente. Este método não é inerentemente melhor do que o anterior, mas está aqui para demonstrar as diferentes notações de linguagem pelas quais um ponteiro para um array pode ser utilizado. Nesse caso, dois argumentos de função são adicionados para especificar a posição dos elementos que precisam ser trocados. Enquanto isso, o acesso ao elemento é feito usando a chamada aritmética de ponteiros, que pode ter uma notação bastante complicada. Observe que incrementar o ponteiro para a matriz por um valor inteiro é igual a incrementar o ponteiro para um tipo de elemento, que move o valor do ponteiro pelos bytes sizeof do tipo de objeto.

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

Resultado:

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

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

Use a referência de array para passar matriz 2D para uma função em C++

Passar os arrays bidimensionais no estilo C pode ficar bem feio, então é preferível usar a notação de referência. Lembre-se, porém, de que as funções de exemplo a seguir seriam adequadas para matrizes de tamanho predefinido, de modo que o protótipo da função inclua o valor do tamanho para cada dimensão. No lado positivo, isso dá a possibilidade de utilizar um loop for baseado em intervalo para a travessia de elementos.

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

Resultado:

[  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

Artigo relacionado - C++ Pointer