C++ Chapter 6.18 : 이중 포인터와 동적 다차원 배열

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


이중 포인터 & 동적 다차원 배열

int value = 5;
int * ptr = &value;
int ** ptrptr = &ptr; // 이중 포인터! 포인터의 포인터. 포인터 변수 ptr의 주소값.
  • *ptrvalue와 같다.
    • 일반 변수 value 간접 참조
    • 5
  • *ptrptrptr와 같다.
    • value의 주소 값.
    • 포인터 변수 ptr을 간접 참조함. ptr엔 value의 주소값이 있음.
  • **ptrptr*(*ptrptr)*ptrvalue는 같다.
    • 이중 간접 참조
    • 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. 이차원 동적 배열의 각 원소들은 1차원 배열의 포인터들이니까 이 각각의 row개의 1차원 배열들을 먼저 delete 해준다.
  2. 원소가 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차원인 것처럼 사용 가능


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기