배열이랑 포인터의 관계를 들어가기 전에, 하나만 짚고 넘어가겠습니다. 배열과 포인터는 같은 개념일까요? 결론부터 말하면 아닙니다. 따라서, 배열 이름을 상수 포인터라고 한 것은, 올바른 표현이 아닙니다. 후자는 아래와 같이 선언된 것을 의미합니다.

 

 

 address 값을 저장하기 위한 별도의 변수가 5번째 줄에 선언이 되어 있습니다.

 

 


 예제 1을 봅시다.

 

 5개의 원소를 저장하고 있는 배열 arr을 선언했습니다. 그리고 어떠한 공간을 가리키는 int형 포인터 변수인 p를 선언했어요. 그리고 p가 가리키고 있는 데이터를 출력하는 간단한 프로그램입니다.

 

 

 4번째 줄을 보시면, arr을 선언했습니다. 그러면 메모리 상에 다음과 같이 할당될 겁니다. 그런데, 배열이던, int형이던, double형이던, 메모리의 어디에 할당이 되어 있는지 모르면 무용지물입니다. 그런가요? array도 마찬가지입니다.

 

 

 그러면, 기준 주소가 있어야 할 겁니다. 이를 0x80이라 합시다.

 

 

 그러면 arr[2]에는 어떻게 접근할 수 있을까요? base 주소는 0x80이였습니다. 한 요소당 차지하고 있는 byte가 4라면, 0x80에 8만큼을 더한 0x88번지에 접근하면 됩니다. 그러면 배열의 주소 값은 무엇일까요?

 

 

 프로그램 2를 실행해 봅시다. 결과가 어떻게 나올까요? 하나는, 배열명, 다른 하나는 arr[0]의 주솟값입니다.

 

 

 두 값이 같은가요? 따라서, arr의 값과 arr[0]의 주솟값은 같다고 할 수 있습니다. 그런데 이것은 단지 배열 시작 주솟값일 뿐입니다. 이것을 어딘가에 저장을 하나요? 아. 물론, 변수의 이름하고, 그 변수가 어디에 저장이 되어 있는지는 컴파일러든 로더가 저장을 하긴 할 겁니다. 그런데 프로그램 내부에서 저장을 하지는 않아요.

 

 


 다시 예제 프로그램으로 돌아와 봅시다. 5번째 줄에 포인터 변수 p에 arr을 넣습니다. arr의 base 주솟값을 넣는다는 것입니다.

 

 

 그러면 메모리에 이렇게 할당이 될 거에요. 보시면 주솟값을 저장하기 위한 포인터 변수인 p가 할당되었어요. 배열명이 주솟값만을 나타냅니다. 주솟값만을 나타내는 것과, 주솟값을 메모리에 저장한다는 것은 다른 개념입니다. 그러면 (*p)를 출력하면 어떤 값이 나올까요?

 

 

 0x80번지로 가서, 실값을 출력한다는 의미이므로 1이 출력됩니다. 주솟값이기 때문에, 주소값을 따라서 접근했을 때 실제 값을 출력하는 연산이 됩니다. 단지, 배열명은 array의 base 주소를 다르게 name으로 표현한 것 뿐입니다.

 

 

 이제 이 프로그램을 봅시다. sizeof는 개체를 메모리에 저장하는 데 필요한 크기를 알아내는 연산자입니다. arr은 array name이고, p는 포인터 변수입니다. 실행 결과를 볼까요?

 

 

 20과 8. 다르다는 것을 알 수 있어요. 글이 다소 길었는데요. 1줄로 요약하면 포인터는 포인터고, 배열은 배열이다. 정도만 기억하시면 되겠습니다. 다음 시간에 배열과 포인터에 대해서 이야기 해 보도록 하겠습니다.