HOWTO · C++
Rückgabe eines Zeigers in C++
Dieser Artikel zeigt, wie ein Zeiger von einer Funktion in C++ zurückgegeben wird
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 ]