2차원 배열은 다음과 같이 선언한다.
int arr[3][4]; // 세로가 3, 가로가 2인 int형 2차원 배열
2차원 배열의 선언 방식은 세로와 가로의 길이를 각각 명시한다. 이 선언으로 할당되는 배열의 모습은 다음과 같다.
1열 | 2열 | 3열 | 4열 | |
1행 | [0][0] | [0][1] | [0][2] | [0][3] |
2행 | [1][0] | [1][1] | [1][2] | [1][3] |
3행 | [2][0] | [2][1] | [2][2] | [2][3] |
위 표에서 삽입된 두개의 숫자는 배열에 접근할 때 사용하게 되는 인덱스값이다. 배열의 이름이 arr이고 배열의 자료형이 TYPE라 할 때 2차원 배열의 선언 형태는 다음과 같다.
TYPE arr[세로길이][가로길이];
sizeof 연산자를 이용하여 2차원 배열의 크기를 확인해보면 다음과 같다.
#include <stdio.h>
int main(void)
{
int arr[3][4];
printf("2차원 배열 크기 : %d\n", sizeof(arr));
return 0;
}
// output : 2차원 배열 크기 : 48
int 형 배열이기 때문에 한 칸에 4씩 계산하여 48이 나온다.
2차원 배열은 다음과 같이 접근하여 값을 저장할 수 있다.
arr[2][1] = 5;
arr[0][1] = 3;
2차원 배열의 메모리 주소값도 1차원 배열과 동일한 구조이다. 예를 들어 세로3, 가로2인 2차원 배열을 선언하여 메모리 주소를 확인하면 다음과 같다.
#include <stdio.h>
int main(void)
{
int arr[3][2];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 2; j++)
{
printf("%p \n", &arr[i][j]);
}
}
return 0;
}
/* output :
0061FF00
0061FF04
0061FF08
0061FF0C
0061FF10
0061FF14
*/
int 형 2차원 배열이기 때문에 4바이트 만큼 차이가 나는 상태로 1열로 할당되어 있다.
2차원 배열도 선언과 동시에 초기화가 가능하다.
int arr[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
위 코드처럼 행 단위로 초기화 할 값들을 별도의 중괄호로 명시해야 한다.
다음 코드와 같이 초기화를 생략한 요소가 있다면 빈 공간은 0으로 초기화 된다.
int arr[3][3] = {
{1},
{4,5},
{7,8,9}
};
다음 코드와 같이 한 줄로 초기화 하는 것도 가능하다.
int arr[3][3] = {1,2,3,4,5,6,7};
위 코드와 같이 부족한 부분이 있다면 마찬가지로 0으로 채워진다.
#include <stdio.h>
int main(void)
{
int arr1[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
int arr2[3][3] = {
{1,2,3},
{4,5},
{7}
};
int arr3[3][3] = {1,2,3,4,5,6};
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", arr1[i][j]);
}
printf("\n");
}
printf("\n");
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
printf("\n");
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", arr3[i][j]);
}
printf("\n");
}
return 0;
}
/* output :
1 2 3
4 5 6
7 8 9
1 2 3
4 5 0
7 0 0
1 2 3
4 5 6
0 0 0
*/
1차원 배열처럼 배열의 길이를 명시하지 않고 초기화 하는것도 가능하다. 그러나 다음과 같이 가로와 세로의 길이를 모두 명시하지 않는 것은 불가능하다.
int arr[][] = {1,2,3,4,5,6,7,8};
배열의 요소가 8개 이므로 1x8, 2x4, 4x2, 8x1의 경우로 여러개의 경우가 있기 때문이다. 그래서 하나를 알려줘야 하는데, 다음과 같이 세로의 길이는 생략이 가능하다. 가로 길이는 생략이 불가능하다. 가로의 길이를 생략하면 위 코드와 같이 컴파일러에서 에러를 발생한다.
int arr[][4] = {1,2,3,4,5,6,7,8};
int arr2[][2] = {1,2,3,4,5,6,7,8};
'Language > C, C++' 카테고리의 다른 글
[C] 더블 포인터 (0) | 2020.12.28 |
---|---|
[C] 3차원 배열 (0) | 2020.12.26 |
[C] 포인터에서 const 사용 (0) | 2020.12.20 |
[C] Call - by - value, Call - by - reference (0) | 2020.12.20 |
[C] 함수 인자로 배열 전달 (0) | 2020.12.20 |