여행을 개발하다

Array(배열) - 2차원 배열의 동적할당 본문

BackEnd/C++

Array(배열) - 2차원 배열의 동적할당

yhtragramming 2019. 5. 10. 23:06

안녕하세요!

 

오늘은 지난 시간에 이어 '2차원 배열의 동적할당'에 대해 알아보겠습니다.

동적 할당이므로 역시 '포인터(pointer)'도 자연스럽게 등장합니다.


1. 2차원 동적 배열의 선언

1차원 배열을 동적으로 할당할 땐, 가로축, 즉 단 하나의 메모리의 시작 위치만 정해주면 되었었죠?

하지만 2차원 배열은 세로축, 배열 안에 있는 다른 배열도 신경써야 하는 번거로움이 생겨버렸어요.

 

그래서 포인터도 2개가 필요해졌네요.

 

하나는 큰 범위에 있는 배열의 시작 메모리 위치를 기억할 포인터 하나,

하나는 인수로 갖고 있는 배열들의 시작 메모리 위치를 기억할 포인터 하나.

이 때 등장하는 개념이 '이중 포인터'입니다.

 

이중 포인터는 '포인터의 포인터'라고 생각하시면 됩니다.

 

포인터 변수'변수가 저장된 메모리의 주소값'을 기억한다면,

이중 포인터'포인터가 저장된 메모리의 주소값'을 기억하는 변수입니다.

표현은 간단히 포인터의 포인터, 즉 '**'로 해요.

 

너무 인셉션 같나요?ㅎㅎ

 

예제로 사용자로부터 얼마의 크기(n)로 배열을 할당할 것인지 물어보고,

입력 받은 n 크기만큼의 2차원 배열을 동적으로 할당해보겠습니다.

(가로와 세로의 크기를 동일하게 할당하겠습니다)

먼저 이중 포인터로 배열 ary를 선언 후, 바깥 배열의 크기부터 할당하겠습니다.

 

이제는 큰 배열의 인수로 있는 내부 배열의 크기를 할당하겠습니다.

가로와 세로의 크기가 동일하므로, 동일한 변수 n을 사용하였습니다.

크기만큼 반복해야 하므로 for문을 사용합니다.

 

여기까지, 2차원 배열의 동적 할당을 끝냈습니다.

 

2. 2차원 동적 배열의 초기화 및 배열 값 입력

동적 할당이라는 의미 자체가 '프로그램이 실행되고 나서 메모리를 할당하는 것'이므로,

사실 선언 후 바로 초기화한다는 자체는 의미가 없습니다.

 

그래서 할당 후에 값을 넣어주는 것으로 초기화를 시켜야겠죠?

 

이전 포스팅에서 정수형 변수 j에 1를 담아 선언 후,

1씩 증가시키며 배열의 크기만큼 숫자로 채워주는 예제를 다시 인용토록 하겠습니다.

 

여기서 j가 끝나는 값은 사용자가 어떤 값을 n에 넣었는지에 따라 달라지겠지요?

배열의 값 입력이 마무리되면, 이제 배열을 출력해보도록 하겠습니다.

 

여기서 느낀 동적 할당의 단점.

변수가 너무 많아져요 ㅎㅎ 저는 i, j, k, l.... o까지 와버렸네요.

 

그래서 길이가 10인 2차원 배열을 입력해보았습니다.

잘 나오네요 : )

 

이제는 길이가 12로...

 

역시 잘 나오는군요 : )

 


지금까지 2차원 배열의 동적할당에 대해 알아보았습니다!

 

감사합니다 : )

Comments