C++에서 포인터 반환

Jinku Hu 2023년10월12일
  1. std::string::data함수를 사용하여 C++의 함수에서 포인터 반환
  2. &variable 주소 연산자을 사용하여 C++의 함수에서 포인터 반환
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 ]
작가: 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

관련 문장 - C++ Pointer