Retorne um ponteiro em C++
-
Use a função
std::string::data
para retornar o ponteiro da função em C++ -
Use a notação de endereço de
&variable
para retornar o ponteiro da função em C++
Este artigo explicará vários métodos de como retornar um ponteiro de uma função em C++.
Use a função std::string::data
para retornar o ponteiro da função em C++
Os tipos de retorno de função geralmente se enquadram em três categorias: valor, referência ou ponteiro. Todos eles têm seus casos de uso ideais nos quais
a maior parte do desempenho é alcançado. Geralmente, o retorno de ponteiros de funções é mais comum na linguagem C, pois C++ fornece um conceito mais eloquente - uma referência para passar e retornar usando funções sem copiar os objetos. Embora existam cenários que podem utilizar melhor os ponteiros, demonstramos alguns exemplos de como retornar valores de ponteiro para diferentes estruturas de dados.
No código de exemplo a seguir, implementamos uma função que leva uma referência a std::string
e retorna o char*
, que é o tipo de dados subjacente. Observe que, a classe std::string
é usada para conter a sequência char
armazenada de forma contígua. Podemos recuperar um ponteiro para o primeiro caractere na sequência usando a função interna data()
e passar depois da instrução return
. Finalmente, podemos operar no array char
usando o ponteiro retornado conforme necessário.
#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;
}
Resultado:
This string shall be reversed
desrever eb llahs gnirts sihT
Use a notação de endereço de &variable
para retornar o ponteiro da função em C++
O operador &
address-of tem suas raízes na linguagem C e C++ o usa com a mesma semântica - para obter o endereço de memória do objeto que o segue. Observe, porém, que tem um comportamento ligeiramente diferente quando o operador &
está sobrecarregado (consulte a página). Nesse caso, demonstramos uma função que recebe um array como um de seus argumentos e retorna o ponteiro para o mesmo array. Visto que o ponteiro para o objeto array é o mesmo que o ponteiro para o primeiro elemento do array, podemos usar a seguinte notação - &arr[0]
para retornar o endereço do array fornecido.
#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;
}
Resultado:
c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]
Como alternativa, pode-se reescrever o código anterior usando apenas o nome da variável à qual o array é referido no bloco de funções. Observe que, embora a função aceite int arr[]
como parâmetro, o compilador não copia o array abaixo, mas passa o ponteiro para ele. Podemos simplesmente passar o nome arr
para a instrução return
e o ponteiro será retornado.
#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;
}
Resultado:
c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]
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