1. 다차원 배열
1차원 배열은 논리적으로 1차원의 형태(선)를 취한다.
마찬가지로 2차원 배열은 2차원의 형태(면)를, 3차원 배열은 3차원의 형태(공간)를 취한다.
4차원 이상의 고차원 배열도 허용되지만, 이는 논리적으로 이해하는 것도 어렵고, 무엇보다도 불필요하다.
1차원 배열은 다음과 같이 선언한다.
int arr1[10];
다차원 배열은 다음과 같이 선언한다.
int arr2[10][10];
int arr3[10][10][30];
선언 방법은 1차원 배열과 유사하지만, 다차원 배열 특성상 가로 뿐 아니라 세로와 높이의 길이도 명시해야 한다.
arr2 는 10×10 정사각형으로, arr3 은 10×10×30 사각기둥으로 비유할 수 있다.
2. 2차원 배열
2차원 배열의 형태는 다음과 같다.
TYPE NAME[ROWS][COLUMNS];
예를 들어 int arr[2][3]; 와 같이 선언했다면 형태는 다음과 같다.
|
1열 |
2열 |
3열 |
1행 |
arr[0][0] |
arr[0][1] |
arr[0][2] |
2행 |
arr[1][0] |
arr[1][1] |
arr[1][2] |
1차원 배열과 마찬가지로 인덱스는 0부터 시작하며, 인덱스로 접근한다.
다만 행과 열을 나타내기 위해 인덱스가 두 번 쓰일 뿐이다.
예를 들어 다음 문장이 실행되면
arr[0][1] = 3;
배열의 상태는 다음과 같다(모든 요소는 0으로 초기화되었다고 가정한다).
|
1열 |
2열 |
3열 |
1행 |
0 |
3 |
0 |
2행 |
0 |
0 |
0 |
첫 번째 인덱스는 행(row)을, 두 번째 인덱스는 열(column)을 나타낸다.
따라서 이를 일반화하면 다음과 같다.
arr[R-1][C-1] = N; //R행 C열에 N 저장
또한 1차원 배열과 마찬가지로 sizeof 연산자를 통해 크기를 알 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
int main()
{
int arr1[2][3];
double arr2[5][6];
printf("arr1의 크기: %d\n", sizeof(arr1));
printf("arr2의 크기: %d\n", sizeof(arr2));
return 0;
}
|
cs |
int형은 4바이트이므로 arr1 의 크기는 4바이트×2×3 = 24바이트고,
double형은 8바이트이므로 arr2 의 크기는 8바이트×5×6 = 240바이트다.
그런데 2차원 배열은 메모리에도 2차원의 형태로 존재할까?
결론부터 말하면, 2차원 배열도 메모리에는 1차원의 형태로 존재한다.
컴퓨터의 메모리는 1차원이므로, 주소값은 다음과 같다.
0x00001000, 0x00001001, 0x00001002, …
만약에 메모리가 2차원이었다면 주소값은 다음과 같았을 것이다.
0x00000000-0x00000000, 0x00000000-0x00000001, 0x00000000-0x00000002, …
예를 들어 int arr[2][3]; 과같이 선언된 배열은 메모리에 다음과 같은 형태로 존재한다.
이는 코드로도 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
int main()
{
int arr[2][3];
int i, j;
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 3; ++j)
{
printf("&arr[%d][%d]: %p ", i, j, &arr[i][j]);
}
}
return 0;
}
|
cs |
각 배열 요소의 주소는 int형의 크기인 4바이트만큼 차이남을 알 수 있다.
3. 2차원 배열의 초기화
2차원 배열 역시 1차원 배열처럼 초기화가 가능하다.
가장 일반적인 방식은 다음이다.
int arr[2][3] = {
,
};
이렇게 초기화된 arr 의 상태는 다음과 같다.
|
1열 |
2열 |
3열 |
1행 |
1 | 2 | 3 |
2행 |
4 | 5 | 6 |
다음과 같은 초기화도 가능하다.
int arr[2][3] = {
,
};
참고로 빈 부분은 0으로 채워지기 때문에 다음과 동일한 선언이다.
int arr[2][3] = {
,
};
이렇게 초기화된 arr 의 상태는 다음과 같다.
|
1열 |
2열 |
3열 |
1행 |
1 | 0 |
0 |
2행 |
4 | 5 |
0 |
중괄호를 쓰지 않고 다음과 같이 초기화할 수도 있다.
int arr[2][3] = {
1, 2, 3,
4, 5
};
참고로 다음과 동일한 선언이다.
int arr[2][3] = { 1, 2, 3, 4, 5 };
이렇게 초기화된 arr 의 상태는 다음과 같다.
|
1열 |
2열 |
3열 |
1행 |
1 | 2 | 3 |
2행 |
4 | 5 |
0 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <stdio.h>
int main()
{
int arr1[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int arr2[2][3] = {
{1},
{4, 5}
};
int arr3[2][3] = { 1, 2, 3, 4, 5 };
int i, j;
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 3; ++j)
{
printf("%2d", arr1[i][j]);
}
printf("\n");
}
printf("\n");
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 3; ++j)
{
printf("%2d", arr2[i][j]);
}
printf("\n");
}
printf("\n");
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 3; ++j)
{
printf("%2d", arr3[i][j]);
}
printf("\n");
}
return 0;
}
|
cs |
1차원 배열은 다음과 같이 길이 정보를 명시하지 않고 초기화 리스트를 명시함으로써 초기화할 수 있었다.
int arr[] = { 1, 3, 5, 7, 9 };
2차원 배열 역시 이와 같은 초기화가 가능하다.
int arr[][] = { 1, 2, 3, 4, 5, 6, 7, 8 };
하지만 길이 정보가 아무것도 없을 시 문제가 발생한다.
요소가 8개인 것은 알겠는데, 4×2인지 2×4인지 알 수 없으니 에러가 발생하는 것이다.
따라서 2차원 배열을 초기화할 때는 열의 길이를 명시해야 한다.
int arr[][4] = { 1, 2, 3, 4, 5, 6, 7, 8 };
참고로 행 수(세로 길이)만 생략할 수 있다.
4. 3차원 배열
1차원 배열이 선, 2차원 배열이 직사각형이라면 3차원 배열은 직육면체에 비유할 수 있다.
기본적으로 2차원 배열과 같다. 다만 거기에 높이 정보가 추가될 뿐이다.
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
int main()
{
int arr1[5][3][2];
double arr2[3][5][4];
printf("arr1: %d\n", sizeof(arr1));
printf("arr2: %d\n", sizeof(arr2));
return 0;
}
|
cs |
높이 5 × 세로 3 × 가로 2 × sizeof(int) = 120
높이 3 × 세로 5 × 가로 4 × sizeof(double) = 480
3차원 배열이 논리적으로 직육면체 구조임을 알 수 있다.
2차원 배열 여러 개가 겹쳐져 있는 형태로 생각해도 좋다.
높이 정보를 명시해야 한다는 점만 제외하면 선언 및 접근 방법도 2차원 배열과 다를 게 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <stdio.h>
int main()
{
int arr[3][2][3] = {
{
{1, 2, 3},
{4, 5, 6}
},
{
{11, 12, 13},
{14, 15, 16}
},
{
{21, 22, 23},
{24, 25, 26}
}
};
int i, j, k;
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 2; ++j)
{
for (k = 0; k < 2; ++k)
{
printf("arr[%d][%d][%d]: %2d ", i, j, k, arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
|
cs |
'Programming > C' 카테고리의 다른 글
함수 포인터 (0) | 2019.04.10 |
---|---|
2차원 배열과 포인터 (0) | 2019.04.09 |
다중 포인터 (0) | 2019.03.24 |
매개변수 (0) | 2019.03.24 |
포인터와 배열의 관계 (0) | 2019.03.17 |