본문 바로가기
휴지통/C 프로그래밍

다차원 배열

by 신재권 2021. 1. 21.

1. 다차원 배열의 이해와 활용

-2차원 배열, 3차원 배열? ok, 4차원 배열, 5차원배열? No!

1차원배열은 선, 2차원 배열은 평면구조, 3차원 배열은 직육면체의 구조 배열이다.

int a1[10] ; //길이가 10인 1차원 배열

int a2[4][5]; //행(가로)4, 열(세로)5인 2차원 배열

int a3[2][3][4]; //높이 2, 행3, 열4 인 3차원 배열

2차원 배열을 이해하면 3차원 배열은 이해가 필요없다.

-다차원 배열을 대표하는 2차원 배열의 선언

int arr[3][4] ; //행4, 열3 인 int형 2차원 배열

이렇게 배열이 선언되면 배열요소안에 삽입된 두 개의 숫자는 각각의 요소에 접근할 때 사용하게 되는 인덱스 값이다.

정리하면 배열의 이름이 arr이고 배열요소의 자료형이 TYPE이라 할때, 2차원 배열의 선언형태는 다음과 같다.

TYPE arr[행][열];

sizeof 연산자를 이용해 2차원 배열의 크기를 계산하면

type * 행*열 값이 나온다.

-2차원 배열요소의 접근

다음의 배열이 선언되어 모든 배열의 요소가 0으로 초기화 되었다고 가정한다.

int arr[3][3];

그렇다면 메모리 공간에 배열이 존재하게 된다.

이 상황에서 다음 문장이 실행되면 ,

arr[0][0] =1;

인덱스 값 기준으로 행0, 열0의 위치에 1이 삽입되어 다음의 형태가 된다.

이렇듯 이름이 arr인 int형 배열의 대상으로 행 N번째 위치, 가로 M번째 위치에 저장된 값을 변경 및 참조하는 방법을 일반화하면 다음과 같다.

arr[N-1][M-1] = 20; 값 저장

printf("%d", arr[n-1][M-1]); 저장된값 출력

2차원 배열을 입력받기 위해서는 이중반복문을 사용한다.

-2차원 배열의 메모리상 할당의 형태

2차원 배열은 물리적으로도 2차원의 형태로 존재하지 않는다. 컴퓨터의 메모리는 2차원적 구조가 아니다. 이는 메모리의 주소값을 통해 할 수 있다.

1차원 배열은

0x1001번지, 0x1002번지, 0x1003번지,0x1004번지,0x1005번지.. 라 가정하면

2차원 배열은 메모리상에는 1차원의 형태로 존재한다. int b[4][2] ; 배열을 선언하면

0x1000 =arr[0][0]

0x1004 =arr[0][1]

0x1008 =arr[1][0]

0x100C =arr[1][1]

0x1010 =arr[2][0]

0x1014 =arr[2][1]

으로 메모리 할당이 된다.

배열요소 별 주소값은 int형 변수의 크기인 4바이트만큼만 차이가 남을 알수 있다.

-2차원 배열 선언과 동시에 초기화 하기

1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화가 가능하다.

int arr[3][3] = {

{1, 2, 3} ,

{4, 5, 6} ,

{7, 8, 9}

};

으로 초기화 되는 보이듯이 초기화 리스트 안에는 행 단위로 초기화 할 값들을 별도의 중괄호로 명시해야 한다.

물론 모든 배열요소를 초기화 하지 않고 생략이 가능하다 . 1차원 배열과 마찬가지로 0으로 초기화된다.

int arr[3][3] = {

{1} ,

{4, 5} ,

{7, 8, 9}

};

이렇게 초기화된다.

int arr[3][3] = {

{1, 0, 0} ,

{4, 5, 0} ,

{7, 8, 9}

};

배열의 모든 행은 3개의 요소로 이뤄져있다. 값이 부족할시 빈영역은 0으로 초기화된다.

마지막으로 다음과 같이 하나의 중괄호 안에 초기화할 값을 순서대로 나열할 수 도 있다.

int arr[3][3] = {1,2,3,4,5,6,7} ;

다음과 같이 행단위 중괄호 없이 초기화 리스트를 나열하면 1행 1열부터 시작해서 배열의 마지막 요소까지 순서대로 값이 초기화되는데, 부족한 영역은 0으로 초기화된다.

-배열의 크기를 알려주지 않고 초기화하기

1차원 배열 선언시, 초기화 리스트가 존재한다면, 배열의 길이를 명시하지 않아도 됨을 기억할 것이다. 이는 2차원 배열에도 마찬가지이다.

2차원 배열도 초기화리스트가 존재한다면, 그 길이를 명시하지 않아도 된다. 단 , 여기에는 제약사항이 있다.

int arr[] [] = {...} 만약 요소가 8개이면 경우의수(8x1, 4x2..)가 많아 컴파일을 하지 못한다.

그래서 한 개의 정보를 알려주어야 한다.

int arr[] [4] ; 요소가 8개이면 열이 4이므로 행은 자동으로 2가된다.

이렇듯 2차원 배열을 선언과 동시에 초기화 하는 경우 행만 생략이 가능하다.

2. 3차원 배열

3차원 배열은 흔히 사용되는 배열이 아니며, 2차원 배열을 이해하고 있다면, 3차원 배열도 이해하고 있는 것이다.

3차원 배열은 매우 제한적인 상황에서 사용된다.

-3차원 배열의 논리적 구조

3차원 배열은 중심부의 블록이 채워진 형태의 큐빅퍼즐에 비유할 수 있다.

3차원 배열은 가로, 세로 , 높이의 개념이 있다.

따라서 선언은 이렇게 한다.

int arr1[2][3][4]; //높이, 행, 열

sizeof의 연산을 통해서 배열의 크기를 확인하면 높이 x 행 x 열 x type이 나온다.

따라서 3차원 배열이 논리적으로 직육면체 형태의 배열임을 이해할 수있다.

-3차원 배열의 선언과 접근

높이 정보를 반영을 제외하면 3차원 배열의 선언 및 접근방식은 2차원 배열의 선언 및 접근방법과 차이를 보이지 않는다.

2차원 배열의 초기화 리스트는 1차원 배열의 초기화 리스트가 다수 모여있는 형태이다.

마찬가지로 3차원배열의 초기화리스트는 다수의 2차원배열 초기화 리스트로 이뤄져있는 형태이다.

사실 3차원 배열은 여러 개의 2차원 배열이 모여있는 형태로 이해하는 것이 더 합리적이다.

'휴지통 > C 프로그래밍' 카테고리의 다른 글

다차원 배열과 포인터의 관계  (0) 2021.01.21
포인터의 포인터  (0) 2021.01.21
포인터와 함수에 대한 이해  (0) 2021.01.21
포인터와 배열  (0) 2021.01.21
포인터의 이해  (0) 2021.01.21