작성
·
350
1
이중 포인터에는 포인터의 주소만 저장이 가능한 것으로 알고 있습니다. 그래서 동적 다차원 배열을 만들 때 이중 포인터를 정의하면
int** matrix = new int* [row];
이렇게 정의가 가능합니다.
제가 이해가 안되는 부분은 바로 뒤에 나오는 반복문 입니다.
for (int r = 0; r < row; ++r)
{
matrix[r] = new int[col];
}
여기서 matrix에 저장되는 것이 new int[col] 인데, 이는 포인터가 가지는 행렬의 주소로 생각 됩니다. matrix[0]은 matrix 라는 이중 포인터 안에 저장되있는 첫번째 포인터를 나타내어서 저렇게 작성되는 것인지 궁금합니다.
답변 2
1
안녕하세요, 답변 도우미 Soobak 입니다.
NE 님께서 매우 정확하게 설명해주셨습니다.
따라서, NE 님의 답변을 정리를 하는 식으로 부연 설명 및 답변을 드리도록 하겠습니다.
matrix
는 int*
타입의 데이터를 가리킬 수 있는 포인터입니다.
즉, int**
타입입니다.
new int*[row]
로 생성되는 메모리는 int*
타입의 데이터 row
개를 저장할 수 있는 공간입니다. 이 메모리의 시작 주소가 matrix
에 할당됩니다.
matrix[r]
는 int
타입의 데이터를 가리킬 수 있는 포인터입니다.
즉, int*
타입입니다.
new int[col]
로 생성되는 메모리는 int
타입의 데이터 col
개를 저장할 수 있는 공간입니다. 이 메모리의 시작 주소가 matrix[r]
에 할당됩니다.
int** matrix
는 이중 포인터입니다. 즉, 포인터의 포인터입니다.
int** matrix = new int* [row];
의 코드라인에서 new int* [row]
는 int*
타입의 포인터 배열을 생성하고, 그 배열의 첫 번째 원소의 주소를 matrix
에 저장합니다.
그러므로 matrix
는 이 배열의 첫 번째 포인터(즉, int*
타입의 포인터)를 가리킵니다.
for
반복문 내부의 코드 중 matrix[r] = new int[col];
코드라인에서 matrix[r]
은 int*
타입의 포인터입니다.new int[col]
은 정수 배열을 생성하고, 그 배열의 첫 번째 원소의 주소를 반환합니다.
그리고 그 주소가 matrix[r]
에 저장됩니다.
요약하자면, matrix[0]
, matrix[1]
, ...
, matrix[row-1]
는 모두 int*
타입의 포인터입니다. 각각의 matrix[r]
은 new int[col]
로 생성된 정수 배열의 첫 번째 원소를 가리킵니다.
1
설명을 위해서 int** matrix = new int*[row]; 라는 구문을
아래와 같이 선언문과 메모리 할당문으로 분리하겠습니다.
int** matrix = nullptr; // (1)
matrix = new int*[row]; // (2)
(1)번 코드는 int** matrix라는 선언문으로, matrix는 int* 타입 정보를 가리킬(저장할) 수 있는 포인터 변수라는 의미입니다.
(2)번 코드는 int* 타입(크기) 데이터를 row개 담을 수 있는 메모리를 동적으로 생성하고 이 메모리의 시작 주소를 matrix에 저장한다는 의미입니다.
matirx[r] = new int[col] 코드를 위와 같이 풀이하면.
int 타입 데이터를 col개 담을 수 있는 메모리를 동적으로 생성하고
이 메모리의 시작 주소를 matrix[r]에 저장한다는 의미입니다.
(정리)
1. matrix에 저장되는 것은 new int*[row]로 생성된 메모리의 시작 주소입니다.
2. matrix[r]에 저장되는 것은 new int[col]로 생성된 메모리의 시작 주소입니다.