Devolver un puntero en C++

Jinku Hu 12 octubre 2023
  1. Utilice la función std::string::data para devolver el puntero desde la función en C++
  2. Utilice la notación de dirección de &variable para devolver el puntero de la función en C++
Devolver un puntero en C++

Este artículo explicará varios métodos de cómo devolver un puntero desde una función en C++.

Utilice la función std::string::data para devolver el puntero desde la función en C++

Los tipos de retorno de función generalmente se dividen en tres categorías: valor, referencia o puntero. Todos ellos tienen sus casos de uso óptimos en los que
se alcanza la mayor parte del rendimiento. Generalmente, devolver punteros de funciones es más común en el lenguaje C, ya que C++ proporciona un concepto más elocuente: una referencia para pasar y devolver usando funciones sin copiar los objetos. Aunque hay escenarios que pueden utilizar mejor los punteros, mostramos algunos ejemplos de cómo devolver valores de puntero para diferentes estructuras de datos.

En el siguiente código de ejemplo, implementamos una función que toma una referencia a std::string y devuelve el char*, que es el tipo de datos subyacente. Tenga en cuenta que la clase std::string se utiliza para contener la secuencia char almacenada de forma contigua. Podemos recuperar un puntero al primer carácter de la secuencia usando la función incorporada data() y pasar después de la instrucción return. Finalmente, podemos operar en el array char usando el puntero devuelto según sea necesario.

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

Producción :

This string shall be reversed
desrever eb llahs gnirts sihT

Utilice la notación de dirección de &variable para devolver el puntero de la función en C++

El operador & address-of tiene sus raíces en el lenguaje C y C++ lo usa con la misma semántica: para tomar la dirección de memoria del objeto que lo sigue. Sin embargo, tenga en cuenta que tiene un comportamiento ligeramente diferente cuando el operador & está sobrecargado (consulte la página). En este caso, demostramos una función que toma un array como uno de sus argumentos y devuelve el puntero a la misma matriz. Dado que el puntero al objeto del array es el mismo que el puntero al primer elemento del array, podemos usar la siguiente notación - &arr[0] para devolver la dirección del array dada.

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

Producción :

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

Alternativamente, se puede reescribir el código anterior usando solo el nombre de la variable a la que se hace referencia a el array en el bloque de funciones. Tenga en cuenta que, aunque la función toma int arr[] como parámetro, el compilador no copia el array debajo, sino que le pasa el puntero. Podemos simplemente pasar el nombre arr a la declaración return y se devolverá el puntero.

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

Producción :

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

Artículo relacionado - C++ Pointer