Renvoyer un pointeur en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction std::string::data pour renvoyer le pointeur de la fonction en C++
  2. Utilisez &variable Address-Of Notation pour renvoyer le pointeur de la fonction en C++
Renvoyer un pointeur en C++

Cet article explique plusieurs méthodes pour renvoyer un pointeur à partir d’une fonction en C++.

Utilisez la fonction std::string::data pour renvoyer le pointeur de la fonction en C++

Les types de retour de fonction se divisent généralement en trois catégories: valeur, référence ou pointeur. Tous ont leurs cas d’utilisation optimaux dans lesquels
la plupart des performances sont atteintes. En règle générale, le retour de pointeurs à partir de fonctions est plus courant dans le langage C, car C++ fournit un concept plus éloquent - une référence pour passer et retourner à l’aide de fonctions sans copier les objets. Bien qu’il existe des scénarios qui peuvent mieux utiliser les pointeurs, nous montrons donc quelques exemples sur la façon de renvoyer des valeurs de pointeur pour différentes structures de données.

Dans l’exemple de code suivant, nous implémentons une fonction qui prend une référence à std::string et renvoie le char*, qui est le type de données sous-jacent. Notez que la classe std::string est utilisée pour contenir la séquence char stockée de manière contiguë. On peut récupérer un pointeur sur le premier caractère de la séquence en utilisant la fonction intégrée data() et passer après l’instruction return. Enfin, nous pouvons opérer sur le tableau char en utilisant le pointeur retourné selon les besoins.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

char *reverseString(string &s) {
  reverse(s.begin(), s.end());
  return s.data();
}

int main() {
  string str = "This string shall be reversed";

  cout << str << endl;
  cout << reverseString(str) << endl;

  return EXIT_SUCCESS;
}

Production:

This string shall be reversed
desrever eb llahs gnirts sihT

Utilisez &variable Address-Of Notation pour renvoyer le pointeur de la fonction en C++

& L’opérateur address-of a ses racines en arrière en langage C et C++ l’utilise avec la même sémantique - pour prendre l’adresse mémoire de l’objet qui le suit. Notez cependant qu’il a un comportement légèrement différent lorsque l’opérateur & est surchargé (voir la page). Dans ce cas, nous démontrons une fonction qui prend un tableau comme l’un de ses arguments et renvoie le pointeur vers le même tableau. Puisque le pointeur vers l’objet tableau est le même que le pointeur vers le premier élément du tableau, nous pouvons utiliser la notation suivante - &arr[0] pour renvoyer l’adresse du tableau donné.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

int *subtructArray(int arr[], size_t size, int subtrahend) {
  for (size_t i = 0; i < size; ++i) {
    arr[i] -= subtrahend;
  }
  return &arr[0];
}

int main() {
  int c_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int num = 3;

  auto arr_size = sizeof c_array / sizeof c_array[0];
  int *ptr = subtructArray(c_array, arr_size, num);

  cout << "c_array = [ ";
  for (int i = 0; i < arr_size; ++i) {
    cout << ptr[i] << ", ";
  }
  cout << "\b\b ]" << endl;

  return EXIT_SUCCESS;
}

Production:

c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]

Alternativement, on peut réécrire le code précédent en utilisant uniquement le nom de variable auquel le tableau est référencé dans le bloc fonction. Notez que, même si la fonction prend le int arr[] comme paramètre, le compilateur ne copie pas le tableau en dessous mais lui passe plutôt le pointeur. Nous pouvons simplement passer le nom arr à l’instruction return, et le pointeur sera retourné.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

int *subtructArray(int arr[], size_t size, int subtrahend) {
  for (size_t i = 0; i < size; ++i) {
    arr[i] -= subtrahend;
  }
  return arr;
}

int main() {
  int c_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int num = 3;

  auto arr_size = sizeof c_array / sizeof c_array[0];
  int *ptr = subtructArray(c_array, arr_size, num);

  cout << "c_array = [ ";
  for (int i = 0; i < arr_size; ++i) {
    cout << ptr[i] << ", ";
  }
  cout << "\b\b ]" << endl;

  return EXIT_SUCCESS;
}

Production:

c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]
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