강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

GeunWoo Kim님의 프로필 이미지
GeunWoo Kim

작성한 질문수

홍정모의 따라하며 배우는 C++

6.19 다중 포인터와 동적 다차원 배열

다차원 배열 동적 할당 질문

작성

·

200

0

안녕하세요 

강의 질문에 올려달라고 하셔서 다시 글 씁니다.

이 강의에서 2차원 배열을 동적 할당 할 때에 

const int row = 3;

const int col 5;

int **matrix = new int*[row];

for (int r = 0; r < row; ++r)

 matrix[r] = new int[col];

위와 같이 예를 들어 주셨는데요.

이중 포인터를 이용해서 2차원 배열 matrix가 어떻게 정의 되는지는 이해를 하였지만

new int*[row] 부분에서 int와 [row] 사이의 *는 무엇을 의미하는 건가요? *[]형태는 처음 보는 것 같아서요.

그냥 new int[row]로 해도 머릿속에선 될 것 같은데 컴파일 해보면

initializing: cannot converet from 'int *' to 'int **' 이라고 나오네요. 

또 메모리 저장되는 것 관련해서도 의문점 이있습니다. 

그냥 정적할당으로 matrix[row][col]; 이런식으로 정의를 하면 

matrix[0][0], matrix[1][0], matrix[2][0] 이 딱 메모리 주소가 20씩 차이나서 연달아 있는데

new를 이용해서 동적할당으로 배열을 정의하면 메모리 주소가 좀 뒤죽박죽이더라구요.

이렇게 되면 큰 배열을 이용해서 실제 계산을 할 때 좀 비효율적이 되지 않나요?  연속적으로 하려면 어떤 식으로

동적 할당을 해야 하나요?

그리고 비슷한 식으로 3차원 배열도 만들어 보았는데요.

d3[nx][ny][nz]인 3차원 배열을 만들기 위해

int ***d3 = new int**[nx];

for (int i = 0; i < nx; ++i)

{

d3[i] = new int*[ny];

for (int j = 0; j < ny; ++j)

d3[i][j] = new int[nz];

}

위와 같이 만들어서 제대로 나오는 것도 확인 했습니다.

문제는 안되지만, 배열 할당하는것치고 조금 코드 자체가 긴것같아서요.. 혹시 조금 더 깔끔하게 만드는 법이 있을까요?

fortran 같은 경우에는 그냥 allocate( d3(nx, ny, nz) )이런 식으로 한 줄이면 끝났거든요. 

질문이 좀 많지만 답변해주시면 정말 감사하겠습니다!  

답변 1

1

홍정모님의 프로필 이미지
홍정모
지식공유자

다차원 배열은 처음에 이해하기 어려운 부분이 맞습니다.

본 강의에서는  '다중 포인터'의 개념을 공부하기 위해서 1차원 동적할당 배열을 여러 개 묶어서 2차원 배열처럼 사용하는 방법을 다루고 있습니다. 

예전에는 메모리가 적어서 2차원 배열 전체를 메모리에 한 번에 잡기가 어려워서 1차원 배열 여러개로 나누기도 했겠지만 요즘에는 그럴 필요가 없지요. 특히 비전 분야에서는 그냥 1차원 배열 하나를 2차원 배열처럼 사용합니다. 2차원 또는 3차원 배열 indexing 하는 방법은 강의에 나올겁니다. 

C++ 실무에서는 스스로 Array2D와 같은 class를 만들어 쓰시거나 eigen3나 OpenCV 등의 라이브러리를 사용하시는 경우가 대부분일겁니다.

그렇다고 다중 포인터 이해하기 어렵다고 그냥 넘어가시면 나중에 자료구조, 알고리즘, 희소행렬, 등등 계속 막힐텐데 일단 이해는 하고 계시는 것으로 보입니다.

GeunWoo Kim님의 프로필 이미지
GeunWoo Kim

작성한 질문수

질문하기