C++의 배열에 대한 포인터

Jinku Hu 2023년10월12일
  1. 배열에 포인터를 사용하여 C++에서 다른 배열의 요소 교체
  2. 배열 참조를 사용하여 C++의 함수에 2D 배열 전달
C++의 배열에 대한 포인터

이 기사에서는 C++에서 배열에 대한 포인터를 사용하는 방법에 대한 여러 방법을 보여줍니다.

배열에 포인터를 사용하여 C++에서 다른 배열의 요소 교체

포인터는 저수준 프로그래밍의 핵심 요소 중 하나입니다. C++에서 일부 사용 사례를 참조로 대체하려고하지만 포인터는 여전히 메모리를 직접 처리하는 데 사용할 수있는 내장 데이터 유형일뿐입니다. C 스타일 배열은 기본적으로 시작 요소에 대한 포인터이며 고정 크기 컴파일러가 있기 때문에 내부적으로[]표기법을 사용하여 액세스를 자동으로 처리합니다. 다음 예제 코드에서는 서로 다른 정수 배열에서 두 요소를 교체하는 함수를 구현합니다. 함수 프로토 타입은 두 개의int*포인터를 사용하여 교체해야하는 요소를 나타냅니다. 포인터를 사용하면 단순히 요소의 로컬 인스턴스를 수정하는 대신 주어진 요소의 메모리 위치에 직접 액세스 할 수 있습니다.

#include <iostream>

using std::cout;
using std::endl;

constexpr int SIZE = 4;

void swapArrayElements(int* e1, int* e2) {
  int z = *e1;
  *e1 = *e2;
  *e2 = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(&arr1[0], &arr2[3]);
  printArray(arr1);
  printArray(arr2);
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

11, 42, 53, 44,
10, 21, 30, 99,

99, 42, 53, 44,
10, 21, 30, 11,

또는 배열 포인터와 요소 위치를 별도로 전달할 수 있습니다. 이 방법은 본질적으로 이전 방법보다 낫지는 않지만 배열에 대한 포인터를 사용할 수있는 다른 언어 표기법을 보여주기 위해 여기에 있습니다. 이 경우 교체해야하는 요소의 위치를 ​​지정하기 위해 두 개의 함수 인수가 추가됩니다. 한편, 요소 액세스는 소위포인터 산술을 사용하여 수행되며 이는 상당히 번거로운 표기법을 가질 수 있습니다. 배열에 대한 포인터를 정수 값만큼 증가시키는 것은 포인터 값을 객체 유형의sizeof바이트만큼 이동시키는 요소 유형에 대한 포인터를 증가시키는 것과 같습니다.

#include <iostream>

using std::cout;
using std::endl;

constexpr int SIZE = 4;

void swapArrayElements(int* arr1, int e1, int* arr2, int e2) {
  int z = *(arr1 + e1);
  *(arr1 + e1) = *(arr2 + e2);
  *(arr2 + e2) = z;
}

void printArray(int (&arr)[SIZE]) {
  for (const auto& item : arr) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  int arr1[] = {11, 42, 53, 44};
  int arr2[] = {10, 21, 30, 99};

  printArray(arr1);
  printArray(arr2);
  cout << endl;
  swapArrayElements(arr1, 1, arr2, 2);
  printArray(arr1);
  printArray(arr2);
  cout << endl;
}

출력:

99, 42, 53, 44,
10, 21, 30, 11,

99, 30, 53, 44,
10, 21, 42, 11,

배열 참조를 사용하여 C++의 함수에 2D 배열 전달

2 차원 C 스타일 배열을 전달하는 것은 매우 추악해질 수 있으므로 대신 참조 표기법을 사용하는 것이 좋습니다. 그러나 다음 예제 함수는 미리 정의 된 길이 크기 배열에 적합하므로 함수 프로토 타입에 각 차원의 크기 값이 포함됩니다. 장점은 요소 순회를 위해 범위 기반for루프를 활용할 수 있다는 것입니다.

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

constexpr int SIZE = 4;

void MultiplyArrayByTwo(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    for (int& j : i) j *= 2;
  }
}

void printArray(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
}

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

  return EXIT_SUCCESS;
}

출력:

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

[  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++ Pointer