2차원 이상의 배열을 다차원 배열이라고 합니다. 2차원 배열은 1차원 배열을 겹겹이 쌓아 놓은 형태이며 수학의 행렬과 같은 구조를 가집니다. 이번 페이지에서는 2차원 배열에 대해 알아보겠습니다.
2차원 배열의 선언
자료형 배열명[행의 수][열의 수];
int num[4][6];
num[0][0] | num[0][1] | num[0][2] | num[0][3] | num[0][4] | num[0][5] |
num[1][0] | num[1][1] | num[1][2] | num[1][3] | num[1][4] | num[1][5] |
num[2][0] | num[2][1] | num[2][2] | num[2][3] | num[2][4] | num[2][5] |
num[3][0] | num[3][1] | num[3][2] | num[3][3] | num[3][4] | num[3][5] |
2차원 배열도 1차원 배열과 마찬가지로 배열의 인덱스(Index)를 통해 접근 가능하며, 인덱스는 행과 열 모두 0부터 시작합니다. 실제 메모리 공간에는 위의 그림과 같이 연속적인 구조로 할당되며 모두 4Byte*4*6=96Byte의 크기를 가집니다.
2차원 배열의 초기화
초기화값은 행 단위로 차례대로 저장되며, 배열의 크기보다, 초기화한 값이 적으면 남은 공간은 0으로 초기화됩니다. 또한, 1차원 배열과 마찬가지로 int num[ ][6];과 같이 행의 크기는 생략할 수 있으며 초기화된 값에 따라 행의 크기가 결정됩니다. 행의 크기만 생략 가능하며, 열의 크기를 생략한 경우에는 오류가 발생합니다. 다음은 2차원 배열의 다양한 초기화 유형을 나타내었습니다.
int num[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
int num[3][3]={1, 2, 3, 4};
1 | 2 | 3 |
4 | 0 | 0 |
0 | 0 | 0 |
int num[3][3]={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
int num[3][3]={{1}, {4, 5}, {7, 8, 9}};
1 | 0 | 0 |
4 | 5 | 0 |
7 | 8 | 9 |
int num[ ][3]={{1}, {4, 5}, {7, 8, 9}};
1 | 0 | 0 |
4 | 5 | 0 |
7 | 8 | 9 |
int num[ ][3]={1, 4, 5, 7, 8, 9};
1 | 4 | 5 |
7 | 8 | 9 |
다음은 2차원 배열에 초기화 된 정수를 출력하는 프로그램입니다. 1차원 배열은 하나의 for문을 이용하여 출력할 수 있지만 2차원 배열의 경우 2개의 인덱스가 있으므로 중첩 for문을 이용하여 출력이 가능합니다.
#include <stdio.h>
int main()
{
int i, j;
int num[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t", num[i][j]);
}
printf("\n");
}
return 0;
}
출력 결과
문자열의 초기화
문자열은 각 문자단위로 1차원 배열에 넣고, 마지막에 null문자를 넣어서 처리합니다. 1차원 배열에는 하나의 문자열만 들어가므로, 여러 개의 문자열을 처리하는 경우는 2차원 배열을 이용합니다.
char name[4][5]={"John", "Alex", "Eli", "Owen"};
J | o | h | n | \0 |
A | l | e | x | \0 |
E | l | i | \0 | \0 |
O | w | e | n | \0 |
#include <stdio.h>
int main()
{
int i, j;
char name[4][5]={"John", "Alex", "Eli", "Owen"};
for(i=0;i<4;i++)
{
for(j=0;j<5;j++)
{
printf("%c", name[i][j]);
}
printf("\n");
}
return 0;
}
출력결과
위의 문자열 배열을 변환문자 %s를 이용하여 출력하는 프로그램입니다. %s는 하나의 문자열을 출력하므로 4개의 문자열을 출력하기 위해서는 for문을 4회 반복하면 됩니다. %c와 %s의 출력방법이 어떻게 다른지 비교하여 보시기 바랍니다.
#include <stdio.h>
int main()
{
int i;
char name[4][5]={"John", "Alex", "Eli", "Owen"};
for(i=0;i<4;i++)
{
printf("%s\n", name[i]);
}
return 0;
}
출력결과
2차원 배열 예제
(1단계) 예제1: 2차원 배열 출력
#include <stdio.h>
int main()
{
int i, j;
int num[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t", num[i][j]);
}
}
return 0;
}
(1단계) 예제2: 학번과 이름 출력하기
#include <stdio.h>
int main()
{
int i, j;
int num[2][3]={{2501, 2502, 2503}, {2601, 2602, 2603}};
char name[6][7]={"김길동", "이길동", "홍길동", "최길동", "박길동", "정길동"};
printf("학번\t");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t", num[i][j]);
}
}
printf("\n이름\t");
for(i=0;i<6;i++)
{
printf("%s\t", name[i]);
}
return 0;
}
(1단계) 예제3: 문자열을 입력받고 출력하기
#include <stdio.h>
int main()
{
int i;
char name[5][10];
for(i=0;i<=4;i++)
{
printf("%d번 학생의 이름을 입력하시오:", i+1);
scanf("%s", name[i]);
}
for(i=0;i<=4;i++)
{
printf("%d번\t%s\n", i+1, name[i]);
}
return 0;
}
'C 언어 프로그래밍 > 배열' 카테고리의 다른 글
배열과 문자열 (2) | 2020.06.07 |
---|---|
1차원 배열 (0) | 2020.06.06 |
댓글