• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

이중 포인터에 저장되는 것에 대해 궁금한 점이 있습니다.

23.08.15 18:05 작성 조회수 229

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님의 프로필

Soobak

2023.08.16

안녕하세요, 답변 도우미 Soobak 입니다.

NE 님께서 매우 정확하게 설명해주셨습니다.
따라서, NE 님의 답변을 정리를 하는 식으로 부연 설명 및 답변을 드리도록 하겠습니다.

  • matrixint* 타입의 데이터를 가리킬 수 있는 포인터입니다.
    즉, 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

NE님의 프로필

NE

2023.08.15

설명을 위해서 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]로 생성된 메모리의 시작 주소입니다.