8.5 포인터 배열
배열은 이미 앞에서 배웠습니다. 이제 배열과 메모리 주소와의 관계를 생각해 보겠습니다.
int a[5] = { 1, 2, 3, 4, 5 };
이렇게 배열을 선언하면 정수 다섯 개를 저장할 수 있는 메모리 방이 연속해서 다섯 개 생성됩니다. C 언어가 수행되면 수많은 메모리 방 중에서 정수 다섯 개를 저장하는 데 필요한 20바이트(5개의 정수 × 4바이트) 메모리를 확보할 수 있는 공간을 찾을 것입니다.
사용 가능한 20바이트 메모리 어딘가를 할당 받고, 다섯 개의 방은 각각 a[0], a[1], a[2], a[3], a[4]라는 이름으로 할당됩니다. 여기서 ‘어딘가’는 우리가 신경 쓰지 않아도 되고 알 필요도 없습니다. 컴파일러가 알아서 사용 가능한 메모리 방을 할당합니다.
이처럼 어딘가에 잡은 방이라도 주소는 있겠죠? 각 메모리 방의 주소는 숫자로 표현할 수도 있고, 배열 이름으로도 표현할 수 있습니다. 여기서 각 주소에 해당하는 실질적인 숫자를 물리적 주소(physical address)라 하고, 각 주소에 해당하는 변수를 통해 표현하는 것을 상징적 주소(symbolic address)라고 합니다.
그림 8-17 | 각 메모리 방은 물리적, 상징적 주소로 표현 가능
컴퓨터의 컴파일러가 다섯 개의 정수를 저장하고자 104번지부터 120번지까지 사용 가능한 메모리 방을 할당 받았다고 합시다. 여기서 a[0]의 주소는 104번지라는 숫자로 표현할 수도 있고, 주소 연산자 &를 사용하여 &a[0]라고도 표현할 수 있습니다.
Tip
각 방은 4바이트 크기로 하나의 정수를 저장하므로 처음 방이 104번지였다면 두 번째 방은 4바이트가 더해진 108번지가 되고 마지막 방은 120번지가 됩니다.