Ponteiro para um array em C++
- Use o ponteiro para um array para trocar elementos em diferentes arrays em C++
- Use a referência de array para passar matriz 2D para uma função 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, ]
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