소년코딩

이중 포인터와 동적 다차원 배열 (Pointers to pointers and dynamic multidimensional arrays)

포인터를 가리키는 포인터는 이렇게 예상 할 수 있다. : 다른 포인터의 주소를 보유하는 포인터

int에 대한 일반 포인터는 하나의 별표(*)만 사용해서 선언한다.

int* ptr; // pointer to an int, one asterisk

int에 대한 포인터를 가리키는 포인터는 두 개의 별표(**)를 사용하여 선언한다. 이것을 이중 포인터라고도 부른다.

int** ptrptr; // pointer to a pointer to an int, two asterisks

이중 포인터는 일반 포인터처럼 작동한다.

int value = 5;

int* ptr = &value;
std::cout << *ptr; // dereference pointer to int to get int value

int** ptrptr = &ptr;
std::cout << **ptrptr; // first dereference to get pointer to int, second dereference to get int value

// 5
// 5

이중 포인터를 직접 값으로 설정할 수 없다.

int value = 5;
int** ptrptr = &&value; // not valid

주소 연산자(&)는 l-value가 필요하지만 &value는 r-value이기 때문이다.

그러나 이중 포인터를 null로 설정할 수 있다.

int** ptrptr = nullptr; // use 0 instead prior to C++11

포인터 배열 (Arrays of pointers)

동적으로 포인터의 배열을 할당할 때 이중 포인터가 흔히 쓰인다.

int** array = new int*[10]; // allocate an array of 10 int pointers

배열의 요소가 정수 대신 '정수에 대한 포인터'라는 것만 다를 뿐 일반 동적 할당 배열과 같다.


2차원 동적 할당 배열 (Two-dimensional dynamically allocated arrays)

동적으로 2차원 배열을 할당할 때도 이중 포인터가 쓰인다.

2차원 고정 배열 선언은 아래와 같이 쉽다.

int array[10][5];

동적으로 2차원 배열을 할당하는 것은 좀 더 어렵다. 처음에는 이렇게 시도해볼 수 있다.

int** array = new int[10][5]; // won’t work!

그러나 위 코드는 작동하지 않는다.

가능한 방법은 두 가지가 있다. 맨 오른쪽 배열 차원이 컴파일 타임 상수라면 다음과 같이 할 수 있다.

int (*array)[5] = new int[10][5];

적절한 우선순위를 보장하려면 괄호가 필요하다. C++ 11 이상부터는 auto 키워드를 사용하는 게 좋다.

auto array = new int[10][5]; // so much simpler!

그러나 불행하게도 맨 오른쪽 차원이 컴파일 타임 상수가 아니라면 좀 더 복잡하다.

먼저 포인터의 배열을 할당한 다음 포인터의 배열을 반복해서 각 요소에 동적 배열을 할당해야 한다.

int** array = new int*[10]; // allocate an array of 10 int pointers — these are our rows
for (int count = 0; count < 10; ++count)
    array[count] = new int[5]; // these are our columns

그런 다음 일반적인 방법으로 배열에 접근할 수 있다.

array[9][4] = 3; // This is the same as (array[9])[4] = 3;

2차원 동적 배열을 할당 해제하려면 루프가 필요하다.

for (int count = 0; count < 10; ++count)
    delete[] array[count];
delete[] array; // this needs to be done last

할당한 순서의 반대로 해제해야 한다. 전체 배열을 먼저 해제하면 배열의 요소를 해제하기 위해 전체 배열에 접근해야 하므로 정의되지 않은 동작이 발생한다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/6-14-pointers-to-pointers/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기