강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

최지로님의 프로필 이미지
최지로

작성한 질문수

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

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

int **mat = new int *[row] 제가 잘 이해한거 맞나요?

작성

·

893

0

    int **mat = new int *[row];

    for (int r = 0; r < row; ++r) 

    {

        mat[r] = new int[col]; 

    }

이 부분이 이해하기 진짜 어려웠습니다..

1번 봤을떈 이해가 안갔습니다

그래서 동적할당을 이해못해서 그런가해서

다시보고

생각하면서 코드 하나하나 다시 뜯어서 보고

다시 영상 보면서 코드를 보니까

아래처럼 이해를 했는데 이게 맞는걸까요?

    const int row = 3;

    const int col = 5;

    const int arr[row][col] =

    {

    {1, 2, 3, 4, 5},

    {6, 7, 8, 9, 10},

    {11, 12, 13, 14, 15}

    };

    //출력하기 위해선 초기화를 해줘야됨

    int **mat = new int *[row];

// int *[3]크기의 메모리 할당 / 초기화

    //const int arr[row][col] ={1~15} 초기화 해주기

    for (int r = 0; r < row; ++r) // 3반복 

    {

        mat[r] = new int[col]; 

        //int *r1 = new int{1,2,3,4,5};처럼 초기화를 해야하는데

        //하나하나 다 해줄 수 없으니 int *[5] 크기의 메모리 즉 [col]5개를 3번 반복해서 [r]에 1~15를 저장해줌

    }

    for (int r = 0; r < row; ++r) // row 열 만들기 3

    {

        for (int c = 0; c < col; ++c) // col 열 만들기 5

        {

            mat[r][c] = arr[r][c]; //mat[0~2][0~4]

        }

    }

    //출력용

    for (int r = 0; r < row; ++r)

    {

        for (int c = 0; c < col; ++c)

        {

            cout << mat[r][c] << " ";

        }

        cout << endl;

    }

    //delete

    for (int r = 0; r < row; ++r)

    {

        delete[] mat[r];

    }

    

답변 1

18

    for (int r = 0; r < row; ++r) // 3반복 

    {

        mat[r] = new int[col]; 

        //int *r1 = new int{1,2,3,4,5};처럼 초기화를 해야하는데

        //하나하나 다 해줄 수 없으니 int *[5] 크기의 메모리 즉 [col]5개를 3번 반복해서 [r]에 1~15를 저장해줌

    }

위와 같이 적어주셨는데 이건 초기화 하고자 하는 코드가 아닙니다. 1 ~ 15 값을 저장하는 코드가 이 곳엔 없습니다..!

//하나하나 다 해줄 수 없으니 int *[5] 크기의 메모리 즉 [col]5개를 3번 반복해서 [r]에 1~15를 저장해줌

이 주석은 혹시 아래에 적어주신 코드에 해당하는 주석인가요? 이 부분에 주석을 적어주셔서 여쭤봅니다!

-

     int **mat = new int *[row];

    for (int r = 0; r < row; ++r) 

    {

        mat[r] = new int[col]; 

    }

이 부분이 이해가 어려웠다고 말씀해주셨는데 천천히 그림으로 설명드려보겠습니다. 다차원 배열은 그림 그려보는게 이해가 훨씬 쉬워요!

1️⃣ int **mat = new int *[row];

이중포인터인, 즉 int* 를 저장할 수 있는 포인터인 mat 에 int * 데이터 (즉, int 를 저장할 수 있는 포인터)를 row 개 저장할 수 있는 배열을 동적으로 생성하고 이 배열의 시작 주소를 mat 에 저장합니다. 

즉, 위와 같은 그림이 됩니다. 아직 초기화는 하지 않은 상태이므로 배열은 비어 있는 상태고 공간만 할당 받은 상태에요.

2️⃣ 첫번째 for 문 mat[r] = new int[col];  (질문 주신 for문)

이해를 돕기 위해 mat 가 가리키는 배열을 세로로 눕혀 그려봤습니다. mat 의 원소는 int * 이죠? mat 의 row 개의 원소들이 각각 col 개의 int 배열의 주소를 가리킬 수 있도록 해주는 작업입니다. 즉, col 개의 크기를 가진 int 배열을 row 개 만큼 동적으로 할당받아 만들고 이를 각각 mat 가 가리키는 배열의 원소들에 "값으로 저장"해주는거에요. 위와 같은 그림이 됩니다.

3️⃣ 두번째 for 문 mat[r][c] = arr[r][c]; 

여기서 비로소 mat 원소들이 가리키는 배열의 원소들에 하나하나 값을 넣어 초기화 해줍니다. 예를 들어볼게요. mat[2] 는 뭘까요? mat[2] 는 3 번째 (인덱스2) int 배열의 주소를 담고 있죠. 그러니 mat[2][3] 은 mat[2] 는 3 번째 (인덱스2) int 배열의 4 번째 원소 (인덱스3) 와도 같습니다. 

최지로님의 프로필 이미지
최지로

작성한 질문수

질문하기