C++ Chapter 6.18 : 이중 포인터와 동적 다차원 배열
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
이중 포인터 & 동적 다차원 배열
int value = 5;
int * ptr = &value;
int ** ptrptr = &ptr; // 이중 포인터! 포인터의 포인터. 포인터 변수 ptr의 주소값.
*ptr
은value
와 같다.- 일반 변수 value 간접 참조
- 5
*ptrptr
은ptr
와 같다.- value의 주소 값.
- 포인터 변수 ptr을 간접 참조함. ptr엔 value의 주소값이 있음.
**ptrptr
와*(*ptrptr)
와*ptr
와value
는 같다.- 이중 간접 참조
- 5
2차원 동적 배열 구현하기
2차원 배열
- [row][col] 크기의 2차원 배열
- 원소를 col개 가지고 있는 1차원 배열이 row개 있는 것
- 1차원 배열의 주소가 row개 있는 것이나 마찬가지다.
- 2차원 배열은 포인터의 배열이나 마찬가지다.
// row = 3, col = 5 int * row_1 = new int[col] {1, 2, 3, 4, 5}; // int 원소 5개의 1차원 동적 배열 row_1 int * row_2 = new int[col] {6, 7, 8, 9, 10}; // int 원소 5개의 1차원 동적 배열 row_2 int * row_3 = new int[col] {11, 12, 13, 14, 15}; // int 원소 5개의 1차원 동적 배열 row_2 int ** 2d_array = new int* [row] {row_1, row_2, row_3}; // int* 포인터 원소 3개(= 1차원 배열이름 3개)의 2차원 동적 배열 2d_array // 포인터 3개가 들어있는 배열(포인터)의 주소를 리턴받음 // 포인터의 포인터이므로 2d_array의 타입은 int **가 된다. delete [] row_1; delete [] row_2; delete [] row_3; delete [] 2d_array;
- 2차원 동적 배열은 원소(1차원 배열의 첫번째 원소의 주소)들이 모두 포인터인 배열이다.
- 포인터 3개가 들어있는 배열(포인터)의 주소를 리턴받음
- 리턴받은 이 주소는 포인터(첫번째 원소)의 포인터인 셈
- 포인터의 포인터이므로 2d_array의 타입은
int **
가 된다.
// 💛 2차원 동적 배열 할당 받음. row개의 포인터 원소들을 가진 1차원 배열.
int ** matrix = new int* [row];
// 💛 2차원 배열 matrix의 원소는 각각의 1차원 배열의 시작 주소.
// 💛col개의 원소를 가진 1차원 배열 row개 만큼 동적 할당.
for (int r = 0; r < row; ++r)
matrix[r] = new int[col];
// 💛 초기화 작업. 이중포인터에 [][]로 원소들에 접근할 수 있다.
for (int r = 0; r < row; ++r)
for (int c = 0; c < col; ++c)
matrix[r][c] = r * col + c; // 행마다 0 1 2 3 4 5 6 7 8 9 10 11 이런식으로 초기화 될것
// print all elements
for (int r = 0; r < row; ++r)
{
for (int c = 0; c < col; ++c)
cout << matrix[r][c] << " ";
cout << endl;
}
delete 해주는 것 잊지 말기
- 이차원 동적 배열의 각 원소들은 1차원 배열의 포인터들이니까 이 각각의 row개의 1차원 배열들을 먼저 delete 해준다.
- 원소가 row개 있는 2차원 동적 배열을 delete 해준다.
for (int r = 0; r < row; ++r)
delete [] matrix[r];
delete [] matrix;
1차원 배열을 2차원 배열처럼 사용하기
- 이중 포인터를 쓰지 않고 1차원 배열을 2차원 배열처럼 쓰는 방법
const int row = 3;
const int col = 5;
const int static2Darray[row][col] =
{
{ 1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
};
int *matrix = new int[row * col]; // row * col개의 원소를 가진 1차원 동적 배열 할당
// 초기화
for (int r = 0; r < row; ++r)
for (int c = 0; c < col; ++c)
matrix[col*r + c] = static2Darray[r][c];
// 출력
for (int r = 0; r < row; ++r)
{
for (int c = 0; c < col; ++c)
cout << matrix[col*r + c] << " ";
cout << endl;
}
delete matrix;
col * r
은 몇번째 row 인지를 의미한다.- 2차원인 것처럼 사용 가능
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기