2013년 1월 21일 월요일
배열과 포인터의 차이점
int ar[n];
int *pi;
배열과 포인터의 차이점
1. 포인터는 변수, 배열은 상수
pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할때 그위치가 이미 고정되므로 다른 대상
을 가리킬 수 없다. ar로 오로지 배열의 선두 번지를 읽을 수 있을 뿐이며 이 선두 번지를 기준으로 하여 배열 요소를 읽는다.
2. pi가 가리키는 배열의 크기는 동적으로 결정할 수 있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
동적 할당 예 pi=(int *)malloc(n*sizeof(int));
고정된 길이의 배열이 필요하면 int ar[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변 길이의 배열이 필요하면 int *형의
포인터 변수를 선언한 후 malloc으로 할당해서 사용해야 한다. 포인터로 할당한 배열은 실행중에라도 realloc으로 크기를 재 할당하여
변경할 수 있다.
3. 배열은 인수로 전달 할 수 없고 포인터는 인수로 전달이 가능하다.
배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없다. 포인터는 대상체가 무잇이든간에 4Byte의 크기밖에 차지하지 않으므로
함수로 전달할 수 있다. 그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다.
4. 배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작은 속도 차이가 있다.
배열의 첨자 연산은 매번 배열 선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다.
*pi는 pi가 가리키는 곳을 바로 읽지만 ar[n]은 *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다.
대단한 속도 차이는 아니지만 대규모의 반복적인 루프에서는 이 속도차도 결코 무시 못할 정도로 크다.
대략 포인터가 배열보다 두 배 정도 빠르다.
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기