Rückgabe eines Zeigers in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion std::string::data, um den Zeiger von der Funktion in C++ zurückzugeben
  2. Verwenden Sie die Notationsadresse &variable, um den Zeiger von der Funktion in C++ zurückzugeben
Rückgabe eines Zeigers in C++

In diesem Artikel werden verschiedene Methoden zum Zurückgeben eines Zeigers von einer Funktion in C++ erläutert.

Verwenden Sie die Funktion std::string::data, um den Zeiger von der Funktion in C++ zurückzugeben

Funktionsrückgabetypen lassen sich im Allgemeinen in drei Kategorien einteilen: Wert, Referenz oder Zeiger. Alle von ihnen haben ihre optimalen Anwendungsfälle, in denen
Der größte Teil der Leistung wird erreicht. Im Allgemeinen ist das Zurückgeben von Zeigern von Funktionen in der C-Sprache häufiger, da C++ ein beredteres Konzept bietet - eine Referenz zum Übergeben und Zurückgeben von Funktionen ohne Kopieren der Objekte. Obwohl es Szenarien gibt, in denen Zeiger möglicherweise besser verwendet werden, zeigen wir einige Beispiele für die Rückgabe von Zeigerwerten für verschiedene Datenstrukturen.

Im folgenden Beispielcode implementieren wir eine Funktion, die auf std::string verweist und das char* zurückgibt, das dem zugrunde liegenden Datentyp entspricht. Beachten Sie, dass die Klasse std::string verwendet wird, um die zusammenhängend gespeicherte Sequenz char zu enthalten. Mit der integrierten Funktion data() können wir einen Zeiger auf das erste Zeichen in der Sequenz abrufen und nach der Anweisung return übergeben. Schließlich können wir das Array char nach Bedarf mit dem zurückgegebenen Zeiger bearbeiten.

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

Ausgabe:

This string shall be reversed
desrever eb llahs gnirts sihT

Verwenden Sie die Notationsadresse &variable, um den Zeiger von der Funktion in C++ zurückzugeben

Der &-Adressierungsoperator hat seine Wurzeln in der Sprache C und C++ verwendet ihn mit derselben Semantik - um die Speicheradresse des darauf folgenden Objekts zu übernehmen. Beachten Sie jedoch, dass es ein etwas anderes Verhalten hat, wenn der Operator & überladen ist (siehe Seite). In diesem Fall demonstrieren wir eine Funktion, die ein Array als eines ihrer Argumente verwendet und den Zeiger auf dasselbe Array zurückgibt. Da der Zeiger auf das Array-Objekt mit dem Zeiger auf das erste Element des Arrays identisch ist, können wir die folgende Notation verwenden - &arr[0], um die Adresse des angegebenen Arrays zurückzugeben.

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

Ausgabe:

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

Alternativ kann der vorherige Code nur mit dem Variablennamen umgeschrieben werden, auf den das Array im Funktionsblock verweist. Beachten Sie, dass der Compiler das darunter liegende Array nicht kopiert, sondern den Zeiger darauf übergibt, obwohl die Funktion das Parameter int arr[] als Parameter verwendet. Wir können einfach den Namen arr an die Anweisung return übergeben, und der Zeiger wird zurückgegeben.

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

Ausgabe:

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

Verwandter Artikel - C++ Pointer