502 단어
3 분
C++에서 배열 포인터와 포인터 배열
2025-02-22

배열 포인터와 포인터 배열#

배열 포인터(pointer to an array)와 포인터 배열(array of pointers)은 다릅니다. 배열 포인터는 배열을 가르키는 포인터를 말하는 것이고 포인터 배열은 포인터로 된 배열을 말하는 것입니다. 이 차이는 다차원 동적 배열을 할당할 때 두드러집니다.

배열 포인터로 2차원 배열을 동적 할당하는 코드는 다음과 같습니다.

int (*arr)[열의 수] = new int[행의 수][열의 수];

이 경우에는 2차원 배열이 메모리에 연속적으로 저장됩니다. 하지만 이 방법으로 할당할 시에는 열의 수가 컴파일 시간 상수여야 할 조건을 가집니다. 완전히 동적으로 할당하는 방법은 다음과 같습니다.

포인터 배열을 2차원 동적 할당하는 법은 다음과 같습니다.

 int** arr = new int*[행의 수];
 for (int i = 0; i < 행의 수; ++i)
 {
	 arr[i] = new int[열의 수];
 }
 
 for (int i = 0; i < 행의 수; ++i)
 {
	 delete[] arr[i];
 }
 delete[] arr;

이 방법으로 할당할 시에는 행과 열의 길이 모두 런타임에 정할 수 있지만 메모리에 연속적으로 배치되지 않습니다.

메모리를 더 사용하여 메모리에 연속되어 배치되어있는 2차원 배열을 사용하는 방법은 다음과 같습니다.

int rows = 3;
int cols = 4;
int **arr = new int*[rows];
int *data = new int[rows * cols];

for (int i = 0; i < rows; i++) {
    arr[i] = data + i * cols;
}

delete[] data;
delete[] arr;

이 방법에서 arr 변수를 사용해 일반적인 2차원 배열처럼 사용이 가능합니다. 위 방법을 사용하면 데이터가 들어있는 배열이 연속되어져 배치되어 있어 캐시 메모리를 더 효율적으로 사용할 수 있습니다.