profile image

L o a d i n g . . .

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𝓃-₁ }

 

복사했습니다!