Pointeur vers un tableau en C++

Jinku Hu 12 octobre 2023
  1. Utiliser le pointeur vers un tableau pour échanger des éléments dans différents tableaux en C++
  2. Utiliser une référence de tableau pour transmettre un tableau 2D à une fonction en C++
Pointeur vers un tableau en C++

Cet article présente plusieurs méthodes sur l’utilisation d’un pointeur vers un tableau en C++.

Utiliser le pointeur vers un tableau pour échanger des éléments dans différents tableaux en C++

Le pointeur est l’un des éléments clés de la programmation de bas niveau. Même si C++ tente de remplacer certains de leurs cas d’utilisation par des références, les pointeurs ne sont toujours que des types de données intégrés qui peuvent être utilisés pour gérer directement la mémoire. Notez que le tableau de style C est essentiellement un pointeur vers l’élément de départ et comme il a un compilateur de taille fixe, gère automatiquement les accès avec la notation [] en interne. Dans l’exemple de code suivant, nous implémentons une fonction qui permute deux éléments de différents tableaux d’entiers. Notez que le prototype de fonction prend deux pointeurs int* pour désigner les éléments qui doivent être échangés. Le pointeur permet d’accéder directement à l’emplacement mémoire des éléments donnés au lieu de simplement modifier les instances locales des éléments.

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

Production:

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

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

Alternativement, nous pouvons passer des pointeurs de tableau et des positions d’élément séparément. Cette méthode n’est pas intrinsèquement meilleure que la précédente, mais elle est là pour démontrer les différentes notations de langage par lesquelles un pointeur vers un tableau peut être utilisé. Dans ce cas, deux arguments de fonction sont ajoutés pour spécifier la position des éléments à permuter. Pendant ce temps, l’accès aux éléments se fait en utilisant ce que l’on appelle l'arithmétique du pointeur, qui peut avoir une notation assez lourde. Notez qu’incrémenter le pointeur vers le tableau d’une valeur entière équivaut à incrémenter le pointeur vers un type d’élément, ce qui déplace la valeur du pointeur de la sizeof octets du type d’objet.

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

Production:

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

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

Utiliser une référence de tableau pour transmettre un tableau 2D à une fonction en C++

Passer les tableaux bidimensionnels de style C peut devenir assez moche, il est donc préférable d’utiliser la notation de référence à la place. Cependant, les exemples de fonctions suivants conviendraient aux tableaux prédéfinis de taille de longueur afin que le prototype de fonction inclue la valeur de taille pour chaque dimension. Du côté positif, cela donne la possibilité d’utiliser une boucle for basée sur une plage pour la traversée des éléments.

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

Production:

[  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, ]
Auteur: 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

Article connexe - C++ Pointer