[표 3-5]은 1팀과 2팀에 대한 2016~2017년 분기별 노트북 판매량에 대한 리스트이다.
[ 표 3-6]의 리스트는 팀 순서도 나타내야 하므로 세 종류의 순서를 표현해야 한다. 이럴 때는 면 인덱스, 행 인덱스, 열 인덱스가 있는 3차원 배열을 사용한다.
3차원 배열의 구조는 논리적인 구조일 뿐이고, 메모리에 저장되는 물리 구조는 2차원 배열처럼 1차원의 선형 구조가 된다. 3차원 논리 구조를 1차원의 물리 구조로 변환하는 방법 역시 첫 번째 인덱스인 면을 기준으로 하는 면 우선 순서 방법과 마지막 인덱스인 열을 기준으로 하는 열 우선 순서 방법이 있다.
3차원 논리 구조에 대한 면 우선 순서 방법은 면을 1차 기준으로 하여 같은 면 안에 있는 행을 먼저 저장하는데, 이때 다시 행을 2차 기준으로 하여 같은 행 안에 있는 열을 저장한다. [ 그림 3-12 ] 의 3차원 배열 sale을 면 우선 순서로 저장하면 먼저 면 0을 저장해야 하므로 [ 그림 3-13 ]의 (a)와 같이 sale[0][0][0]=63, sale[0][0][1]=84, sale[0][0][2]=140, sale[0][0][3]=130, sale[0][1][0]=157, sale[0][1][1]=209, sale[0][1][2]=251, sale[0][1][3]=312 순서가 된다. 그리고 면 1을 저장하므로 다음 순서는 sale[1][0][0]=59, sale[1][0][1]=80, sale[1][0][2]=130, sale[1][0][3]=135, sale[1][1][0]=149, sale[1][1][1]=187, sale[1][1][2]=239, sale[1][1][3]=310 이 된다.
다음으로 열 우선 순서 방법은 열을 1차 기준으로 하여 같은 열 안에 있는 행을 먼저 저장하는데, 이때 행을 2차 기준으로 하여 같은 행에 대한 면을 저장한다. 3차원 배열 sale을 열 우선 순서 방법으로 저장하면 [그림 3-13]의 (b)와 같이 sale[0][0][0]=63, sale[1][0][0]=59, sale[0][1][0]=157, sale[1][1][0]=149, sale[0][0][1]=84, sale[1][0][1]=80, sale[0][1][1]=209, sale[1][1][1]=187, sale[0][0][2]=140, sale[1][0][2]=130, sale[0][1][2]=251, sale[1][1][2]=239, sale[0][0][3]=130, sale[1][0][3]=135, sale[0][1][3]=312, sale[1][1][3]=310 순서가 된다
면의 개수가 ni이고 행의 개수가 nj, 열의 개수가 nk인 3차원 배열 A[ni][nj][nk]의 시작 주소가 a이고 원소의 길이가 l일 때, i면 j행 k열 원소, 즉 A[i][j][k]의 위치는 면 우선 순서 구조에서 a+{(i x nj x nk) + ( j x nk) k} x l이 되고, 열 우선 순서 구조에서는 a+ { k x ni x nj ) + ( j x ni ) + i } x l이 된다.
[예제 3-3]은 1팀과 2팀의 2016~2017년 분기별 노트북 판매량 선형 리스트를 3차원 배열로 구현하고 논리적 순서와 물리적 순서가 일치하는 순차 구조인지 확인하는 프로그램이다.
#include <stdio.h>
void main() {
int i, n = 0, *ptr;
int sale[2][2][4] = {{{63, 84 ,140, 130}, // 3차원 배열 초기화
{157, 209, 251, 312}},
{{59, 80, 130, 135},
{149, 187, 239, 310}}};
ptr = &sale[0][0][0];
for (i = 0; i < 16; i++) {
printf("\\n address: %u sale %2d = %3d", ptr, i, *ptr);
ptr++;
}
getchar():
}
10행은 배열 sale의 시작 주소인 &sale[0][0][0]을 포인터 ptr에 지정한다.
11~14행은 배열 sale 의 첫 번째 원소부터 마지막 원소까지 메모리에 저장된 순서대로 출력한다.
12행 : 포인터 ptr에 저장된 배열 원소의 주소를 %u 형식으로 출력하고, 포인터 ptr이 가리키는 참조값 (*ptr)인 배열 원소의 값을 %d 형식으로 출력한다.