C언어에서 배열의 요소는 연속적인 메모리 공간에 할당된다.
1차원 배열
int A[6];
다음의 배열의 각 요소의 주소는 어떻게 계산할 수 있을까?
배열 A는 크기가 6인 int형 배열로 각 요소가 int만큼의 메모리를 가진다.
또한 C언어에서 int형의 크기는 기기에 따라 가변적이기 때문에 int형 자료형의 데이터 길이를 가져오는 sizeof(int) 함수를 사용한다.
C언어에서 배열은 연속적인 주소에 저장되기 때문에
A[0]의 주소를 base address라고 하면 A[i]의 주소는 base + i*sizeof(int)가 된다.
2차원 배열
2차원의 배열은 index가 두개가 있다 행 index와 열 index이다.
int A[2][2]
다음의 배열을 머릿속으로 그려보자
A[0][0] | A[0][1] | A[0][2] |
A[1][0] | A[1][1] | A[1][2] |
A[2][0] | A[2][1] | A[2][2] |
다음과 같은 2차원 배열이 떠오를 것이다.
하지만 프로그램에서는 2차원일지라도 실제 메모리는 다음과 같은 1차원적인 주소로 저장되게 된다.
A[0][0] |
A[0][1] |
A[0][2] |
A[1][0] |
. . . |
A[2][2] |
(행을 중심으로 나열하는 row major 방식 • C언어에서는 row major 방식으로 배열의 주소가 나열되어 있다.)
자 그럼 2차원 배열 요소의 주소도 계산해 보자
int A[3][4]
A[0][0] | A[0][1] | A[0][2] | A[0][3] |
A[1][0] | A[1][1] | A[1][2] | A[1][3] |
A[2][0] | A[2][1] | A[2][2] | A[2][3] |
다음의 2차원 배열이 있다고 하자
A[2][2]의 주소는 어떻게 될까?
행 index가 2이므로 앞에 2개의 행이 있는 것이고 행 하나의 길이는 4이다. => 2*4
열 index가 2이므로 같은 행 안에서 앞에 두개의 열이 있다. => +2
위치는 base + (2*4+2) size(int) 가 된다.
2차원 배열 A[i][j]의 각 요소는 다음과 같이 나타낼 수 있다.
address = base + {i*행 길이+j} * sizeof(자료형)
3차원 배열
3차원 배열 A[u0][u₁][u₂] 는 다음과 같이 나타낼 수 있다.
배열 A[u0][u₁][u₂] 가 있을때
int A[u0][u₁][u₂]
A[i][j][k]의 주소는
base + sizeof(int) * {i*u₁*u₂ + j * u₂ + k}
N차원 배열
N차원 배열 A[u0][u₁][u₂]...[u𝓃-₁]에서
배열 요소 A[i0][i₁][i₂]...[i𝓃-₁] 에 대해 주소를 나타내면
address = base + sizeof(자료형) * { i0 * u₁*u₂*...*u𝓃-₁
+ i₁*u₂*u₃*...*u𝓃-₁
+ i₂*u₃*u₄...*u𝓃-₁
+ ...
+ i𝓃-₁ }
'개발 기초 > Data Structure & Algorithm' 카테고리의 다른 글
[Algorithm, JavaScript] 그래프(graph) (0) | 2022.10.25 |
---|---|
[C/C++, Data Structure] Binary Search Tree를 이용한 단어 빈도 프로그램 (0) | 2021.11.12 |
[C/C++, Data Structure] Stack을 사용한 계산기 (infix to postfix) (1) | 2021.10.26 |
알고리즘의 성능 분석 방법 (0) | 2021.09.07 |