inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

415

yoy06118

작성한 질문수 8

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 라는 이중 포인터 안에 저장되있는 첫번째 포인터를 나타내어서 저렇게 작성되는 것인지 궁금합니다.

c++

답변 2

1

Soobak

안녕하세요, 답변 도우미 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

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

강의자료는 어디서 받을 수 있죠?

1

25

2

교재 있나요?

1

140

2

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

1

93

3

using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다

1

103

2

cstr직접구현

0

117

3

BubbleSort

1

79

2

숙제 마지막 부분

1

80

2

강의와 똑같이 진행했는데 링킹 에러가 발생합니다.

1

96

2

수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??

1

165

2

공변반환형 관련 문의 드립니다.

1

92

2

170강 유니크 포인터에대해 질문있습니다

1

82

1

섹션 5 퀴즈의 답이 이상합니다

1

85

2

이중포인터와 배열이 이해가 안됩니다.

1

159

2

5분 17~5분 34초 객체 잘림 질문

1

80

1

Resource.h 코드 알려주세요

1

74

1

char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다

1

95

2

화면좌측 숫자 보이기

1

116

1

화면 좌측 숫자 보이기

0

68

1

처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??

1

139

3

46강 string 버퍼 질문입니다

1

82

2

프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.

1

125

2

[] 범위 검사시 assert 사용 관련 질문

1

92

2

Lecture 클래스 멤버변수 명명 관련

0

93

2

프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요

0

75

1