C++의 함수에서 2D 배열 반환

Jinku Hu 2023년10월12일
  1. 포인터 표기법을 사용하여 C++의 함수에서 2D 배열 반환
  2. 포인터 대 포인터 표기법을 사용하여 C++의 함수에서 2D 배열 반환
C++의 함수에서 2D 배열 반환

이 기사에서는 C++의 함수에서 2D 배열을 반환하는 방법을 소개합니다.

포인터 표기법을 사용하여 C++의 함수에서 2D 배열 반환

포인터에 의한 반환은 값으로 반환하는 것보다 큰 객체에 선호되는 방법입니다. 2D 배열이 상당히 커질 수 있으므로 다음 코드 예제에서와 같이 행렬의 첫 번째 요소에 ‘포인터’를 전달하는 것이 가장 좋습니다. ModifyArr의 2D 배열 매개 변수는 함수 범위에서 대괄호가있는 요소에 액세스하기 위해 arr[][SIZE]표기법으로 정의됩니다.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

constexpr int SIZE = 4;

int *ModifyArr(int arr[][SIZE], int len) {
  for (int i = 0; i < len; ++i) {
    for (int j = 0; j < len; ++j) {
      arr[i][j] *= 2;
    }
  }
  return reinterpret_cast<int *>(arr);
}

int main() {
  int c_array[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

  cout << "input array\n";
  for (auto &i : c_array) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  int *ptr = ModifyArr(c_array, SIZE);

  cout << "modified array\n";
  for (int i = 0; i < SIZE; ++i) {
    cout << " [ ";
    for (int j = 0; j < SIZE; ++j) {
      cout << setw(2) << *(ptr + (i * SIZE) + j) << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

input array
 [  1,  2,  3,  4, ]
 [  5,  6,  7,  8, ]
 [  9, 10, 11, 12, ]
 [ 13, 14, 15, 16, ]

modified array
 [  2,  4,  6,  8, ]
 [ 10, 12, 14, 16, ]
 [ 18, 20, 22, 24, ]
 [ 26, 28, 30, 32, ]

포인터 대 포인터 표기법을 사용하여 C++의 함수에서 2D 배열 반환

대안으로 포인터 표기법에 대한 포인터를 사용하여 함수에서 배열을 반환 할 수 있습니다. 이 방법은 반환 될 객체가 동적으로 할당되는 경우 다른 방법에 비해 장점이 있습니다. 일반적으로 포인터가 호출자 범위에 반환되면 요소 액세스 식을 수정해야합니다. 배열 주소를int*로 캐스팅 한 다음 역 참조를 통해 값을 얻습니다.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

constexpr int SIZE = 4;

int **ModifyArr2(int *arr, int len) {
  for (int i = 0; i < len; ++i) {
    for (int j = 0; j < len; ++j) *(arr + (i * len) + j) *= 2;
  }
  return reinterpret_cast<int **>(arr);
}

int main() {
  int c_array[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

  cout << "input array\n";
  for (auto &i : c_array) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  int **ptr2 = ModifyArr2(c_array[0], SIZE);

  cout << "modified array\n";
  for (int i = 0; i < SIZE; ++i) {
    cout << " [ ";
    for (int j = 0; j < SIZE; ++j) {
      cout << setw(2) << *((int *)ptr2 + (i * SIZE) + j) << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

input array
 [  1,  2,  3,  4, ]
 [  5,  6,  7,  8, ]
 [  9, 10, 11, 12, ]
 [ 13, 14, 15, 16, ]

modified array
 [  2,  4,  6,  8, ]
 [ 10, 12, 14, 16, ]
 [ 18, 20, 22, 24, ]
 [ 26, 28, 30, 32, ]
작가: 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++ Array