본문으로 바로가기

   

 

다차원 배열은 2차원 이상의 배열을 의미한다.
int arr[10];         // 길이가 10인 1차원 int형 배열
int arr[5][5];      // 가로5행, 세로5열인 2차원 int형 배열
int arr[3][3][3]; // 가로, 세로, 높이가 각각 3인 3차원 int형 배열.
이 중에서 실제로 많이 사용되는 배열은 1차원 배열과 2차원 배열이다. 따라서 2차원 배열이
사실상 다차원 배열을 대표한다고 보면 된다.

Type arr[세로길이][가로길이];

 

 

예를 들어서 0~5로 초기화된, 세로 길이가 3이고 가로 길이가 2인 int형 배열을 선언하면, 

그 배열은 다음의 구조로 메모리상에 존재하게 된다.

>>>>> 2차원 배열의 실제 메모리 할당 형태

 

 

채워지지 않은 빈칸은 0으로 채워진다.

 

배열의 크기를 알려주지 않고 초기화
1차원 배열 선언 시, 초기화 리스트가 존재한다면, 배열의 길이를 명시하지 않아도 된다.
이는 2차원 배열도 마찬가지이다. 하지만 다음의 경우는 예외다.
int arr[][] = {1,2,3,4,5,6,7,8}; // 경우의 수 , 2x4, 4x2, 1x8, 8x1 // 에러
가로와 세로의 길이를 모두 예측하는 것은 불가능하니 하나만이라도 입력하면 에러가 발생하지 않는다.
int arr1[][4] = {1,2,3,4,5,6,7,8};
int arr2[][2] = {1,2,3,4,5,6,7,8};

 


문제1)
사용자로부터 층별로 두 가구가 사는 4층짜리 빌라의 가구별 거주 인원 수를 입력받자.
단, 층별로 두 다구가 사는 4층짜리 빌라이니, 가로가 2이고, 세로가 4인 2차원 배열로 표현하기에 좋은 상황이다.

#include <stdio.h>

void main()
{
	int villa[4][2];
	int popu, i, j;

	// 가구별 거주인원 입력받기
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 2; j++) {
			printf("%d층 %d호 인구수 :  ", i+1, j+1);
			scanf("%d", &villa[i][j]);
		}
	}

	// 빌라의 층별 인구수 출력하기
	for (i = 0; i < 4; i++)
	{
		popu = 0;
		popu += villa[i][0];
		popu += villa[i][1];
		printf("%d층의 인구수 : %d\n", i+1, popu);
	}
}

 

 

문제2)
가로의 길이가 9, 세로의 길이가 3인 int형 2차원 배열을 선언하여 구구단 중 2단, 3단, 4단을 다음과 같이 저장하자. 
2 4 6 8 10 12 1416 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36

#include <stdio.h>

void main()
{
	int i, j;
	int arr[3][9];

	for (i = 0; i < 3; i++) {
		for (j = 0; j < 9; j++) {
			arr[i][j] = (i + 2)*(j + 1);
			printf("%d\t", arr[i][j]);
		}
		printf("\n");
	}
}

 

 

문제3)
1 2 3 4       >>>>>> 1 5
5 6 7 8       >>>>>> 2 6
                                    3 7
                                    4 8
위 그림의 형태대로 배열 A와 배열 B를 선언하자. 그리고 배열 A는 선언과 동시에 그림에서 명시하는 대로 초기화를 진행하자. 그리고 배열 B도 위 그림에서 보이는대로 초기화를 진행하되, 반드시 배열 A에 저장된 값을 이용해서 초기화를 진행해야 한다.

#include <stdio.h>

void main()
{
	int arr1[2][4] = { { 1,2,3,4, },{ 5,6,7,8 } };
	int arr2[4][2];
	int i, j;

	//이동
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 4; j++) {
			arr2[j][i] = arr1[i][j];
		}
	}
	//출력
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 2; j++) {
			printf("%d\t", arr2[i][j]);
		}
		printf("\n");
	}

}