C++에서 포인터 반환
이 기사에서는 C++의 함수에서 포인터를 반환하는 방법에 대한 몇 가지 방법을 설명합니다.
std::string::data
함수를 사용하여 C++의 함수에서 포인터 반환
함수 반환 유형은 일반적으로 값, 참조 또는 포인터의 세 가지 범주로 나뉩니다. 그들 모두는 최적의 사용 사례를 가지고 있습니다.
대부분의 성능에 도달합니다. 일반적으로 함수에서 포인터를 반환하는 것은 C 언어에서 더 일반적입니다. C++는 객체를 복사하지 않고 함수를 사용하여 전달하고 반환하기위한 참조 인보다 웅변적인 개념을 제공하기 때문입니다. 포인터를 더 잘 활용할 수있는 시나리오가 있지만 다른 데이터 구조에 대한 포인터 값을 반환하는 방법에 대한 몇 가지 예를 보여줍니다.
다음 예제 코드에서는std::string
에 대한 참조를 사용하고 기본 데이터 유형 인char*
를 반환하는 함수를 구현합니다. std::string
클래스는 연속적으로 저장된char
시퀀스를 포함하는 데 사용됩니다. data()
내장 함수를 사용하여 시퀀스의 첫 번째 문자에 대한 포인터를 검색하고return
문 다음에 전달할 수 있습니다. 마지막으로 필요에 따라 반환 된 포인터를 사용하여char
배열에 대해 작업 할 수 있습니다.
#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;
}
출력:
This string shall be reversed
desrever eb llahs gnirts sihT
&variable
주소 연산자을 사용하여 C++의 함수에서 포인터 반환
연산자의&
주소는 C 언어로 다시 뿌리를 내리고 C++는 동일한 의미를 사용하여 그 뒤에 오는 객체의 메모리 주소를 사용합니다. 그러나operator&
가 오버로드되면 동작이 약간 다릅니다 (페이지 참조). 이 경우 배열을 인수 중 하나로 취하고 동일한 배열에 대한 포인터를 반환하는 함수를 보여줍니다. 배열 객체에 대한 포인터는 배열의 첫 번째 요소에 대한 포인터와 동일하므로 주어진 배열의 주소를 반환하기 위해&arr[0]
표기법을 사용할 수 있습니다.
#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;
}
출력:
c_array = [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 ]
또는 배열이 함수 블록에서 참조되는 변수 이름 만 사용하여 이전 코드를 다시 작성할 수 있습니다. 함수가int arr[]
를 매개 변수로 사용하더라도 컴파일러는 그 아래에있는 배열을 복사하지 않고 포인터를 전달합니다. arr
이름을return
문에 전달하면 포인터가 반환됩니다.
#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;
}
출력:
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