배열과 포인터가 완전 같지는 않다고 한다. 그럼 차이점은 무엇일까?

int ar[n];
int *pi;

1. 포인터는 변수인데 비해 배열은 상수이다.

  pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할 때 그 위치가 이미 고정되므로 다른 대상을 가리킬 수 없다. ar로는 오로지 배열의 선두 번지를 읽을 수 있을 뿐이다.

2. pi가 가리키는 배열의 크키는 동적으로 결정할 수 있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
 고정된 길이의 배열이 필요하면 int ar[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변길이의 배열이 필요하면 int *형의 포인터 변수를 선언한  후  malloc으로 할당해서 사용해야 한다. 포인터로 할당한 배열은 실행 중에라도 realloc으로 크기를 재할당하여 변경할 수 있다.
 
3. 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트의 크기밖에 차지하지 않으므로 함수로 전달할 수 있다.
 
그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다.

4.배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작의 속도 차이가 있다.
 배열의 첨자 연산은 매번 배열선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다. *pi는 pi가 가리키는 곳을 바로 읽지만 ar[n]은 *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다. 포인터가 배열보다 두배 정도 빠르다.


+ Recent posts