
배열은 단순히 일차원 배열만 있는 것이 아닙니다. 다차원 배열도 충분히 가능합니다. 따라서 이차원 배열에 대해서 알아보도록 하겠습니다. 참고로 일차원 배열과 이차원 배열만 아신다면 다차원배열도 무리없이 아실 수 있을거라고 생각합니다.
일차원 배열을 선언할 때는 밑에 예시처럼 선언했습니다.
int array2[5]; //int형 datatype 5개를 묶어놓은 배열
이차원 배열의 선언은 다음과 같습니다.
int array[5][5];
앞에[5]는 세로길이 뒤에[5]는 가로길이라고 합니다. 그래서 평면 2차원 구조로 이해하시면 편합니다. 행렬도 생각하셔도 됩니다. 저는 조금 다르게 DataType이 길이가 5인 일차원 배열을 5개 모아 놓은 형태라고 이해하고 있습니다.
그럼 이차원 배열의 배열명은 DataType이 어떻게 될까요?
int (*parray)[5];
parray = array;
주소값을 저장하는 포인터라고 생각하면 int형 5개짜리의 주소값을 받을수 있는 형태여야 합니다.
따라서 저런 형태여야 하는게 이해가 됩니다.
int array[i][j];
만약 저런 배열을 선언했다고 하겠습니다. 그럼 길이가 j인 1차원 배열 i개를 모아놓은 2차원 배열입니다. 특정 요소에 값을 넣으려고 합니다. 2가지 방법을 통해서 넣어보겠습니다.
//배열식
array[1][1] = 100;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
array[i][j] = i * 5 + j;
}
}
위와 같은 방법은 배열식에 넣는 방법입니다. 가장 흔한 방법이고 이해하기도 쉽습니다.
//포인터식
*(*(array + 1) + 1) = 100;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
*(*(array + i) + j) = i * 5 + j;
}
}
이 방법은 포인터식을 이용하는 방법입니다. 여기서 연관성을 혹시 찾으셨나요?
array[a][b];
(*(array + a))[b];
*(*(array + a) + b);
위에 3개가 다 같은 공간을 가르킵니다. 즉, array[a] = *(array + a) 로 표현이 가능합니다.
2차원 배열을 1차원 배열로 쪼개서 형변환 한 후에 출력을 한 번 해보겠습니다. 이게 가능한 이유는 제가 설명한 대로 1차원 배열이 모여서 2차원 배열이 되기 때문입니다.
int array[5][5];
int* parray1 = (int*)array;
int()[5] -> int 로 형변환 했습니다 이렇게 되면 parray1은 길이가 25인 1차원 배열이 됩니다.
사실 1차원 배열과 2차원 배열을 이해하셨다면, 3차원 배열부터는 다를게 없습니다. 이해하는데 어려움이 있지는 않을 것 같습니다.
예시
#include <stdio.h>
int main() {
int array[2][2][2];
int(*parray)[2][2];
parray = array;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
parray[i][j][k] = i * 2 * 2 + j * 2 + k;
}
}
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
printf("parray[%d][%d][%d] = %d\n", i, j, k, parray[i][j][k]);
}
}
}
return 0;
}
결과
parray[0][0][0] = 0
parray[0][0][1] = 1
parray[0][1][0] = 2
parray[0][1][1] = 3
parray[1][0][0] = 4
parray[1][0][1] = 5
parray[1][1][0] = 6
parray[1][1][1] = 7
가볍게 예제 몇개만 보겠습니다.
1. array 이차원배열에 0 ~ 24까지 저장하는 함수를 만들고 값을 저장하시오. array 이차원 배열에 저장된 값을 출력하는 함수를 만들고 array 배열에 저장된 값을 출력해보세요.
코드
#include <stdio.h>
void SaveArray(int(*parray)[5], int column, int row) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
parray[i][j] = i * 5 + j;
}
}
}
void PrintArray(int parray[][5], int column, int row) {
printf("이차원 배열 출력\n\n");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("array[%d][%d] = %d\n", i, j, parray[i][j]);
}
}
}
int main() {
int array[5][5];
int col;
int row;
col = sizeof(array) / sizeof(array[0]);
row = sizeof(array) / (sizeof(int) * col);
SaveArray(array, col, row);
PrintArray(array, col, row);
return 0;
}
결과
이차원 배열 출력
array[0][0] = 0
array[0][1] = 1
array[0][2] = 2
array[0][3] = 3
array[0][4] = 4
array[1][0] = 5
array[1][1] = 6
array[1][2] = 7
array[1][3] = 8
array[1][4] = 9
array[2][0] = 10
array[2][1] = 11
array[2][2] = 12
array[2][3] = 13
array[2][4] = 14
array[3][0] = 15
array[3][1] = 16
array[3][2] = 17
array[3][3] = 18
array[3][4] = 19
array[4][0] = 20
array[4][1] = 21
array[4][2] = 22
array[4][3] = 23
array[4][4] = 24
예시#include <strio.h>
void Save99dan(int(*parray)[9], int col, int row) {
for (int i = 2; i < col + 2; i++) {
for (int j = 1; j < row + 1; j++) {
parray[i - 2][j - 1] = i * j;
}
}
for (int i = 2; i < col + 2; i++) {
printf("----%d단----\n", i);
for (int j = 1; j < row + 1; j++) {
printf("%d x %d = %d\n", i, j, parray[i - 2][j - 1]);
}
}
}
int main() {
int arr[8][9];
Save99dan(arr, 8, 9);
return 0;
}
결과
----2단----
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
----3단----
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
----4단----
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
----5단----
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
----6단----
6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54
----7단----
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
----8단----
8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
----9단----
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
예시
#include <stdio.h>
void Save99dan(int(*parray)[9], int col, int row) {
for (int i = 2; i < col + 2; i++) {
for (int j = 1; j < row + 1; j++) {
parray[i - 2][j - 1] = i * j;
}
}
}
void Print99dan(int (*parray)[9],int n, int row) {
if (n > 9) {
printf("단수 잘못 입력!");
return;
}
printf("----%d단----\n", n);
for (int i = 1; i < row + 1; i++) {
printf("%d x %d = %d\n", n, i, parray[n - 2][i - 1]);
}
}
int main() {
int arr[8][9];
Save99dan(arr, 8, 9);
int n = 0;
printf("2~9사이에 숫자 입력: ");
scanf_s("%d", &n);
Print99dan(arr, n, 9);
return 0;
}
결과
2~9사이에 숫자 입력: 4
----4단----
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
2~9사이에 숫자 입력: 11
단수 잘못 입력!
지금까지 이차원배열에 대해서 알아보았습니다.