이중 포인터에 저장되는 것에 대해 궁금한 점이 있습니다.
415
작성한 질문수 8
이중 포인터에는 포인터의 주소만 저장이 가능한 것으로 알고 있습니다. 그래서 동적 다차원 배열을 만들 때 이중 포인터를 정의하면
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]로 생성된 메모리의 시작 주소입니다.
강의자료는 어디서 받을 수 있죠?
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





