Page 55 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 55
지금까지의 내용을 정리하면 아래와 같습니다.
아래 4개의 식은 모두 배열의 각 요소에 접근하는 식입니다.
a[i] *(a + i) p[i] *(p + i) 첫 번째부터 i개 뒤쪽의 요소
아래 4개의 식은 배열의 각 요소를 가리키는 포인터입니다.
&a[i] a + i &p[i] p + i 첫 번째부터 i개 뒤쪽의 요소를 가리키는 포인터
또 첫 번째 요소를 가리키는 포인터 a + 0과 p + 0은 간단히 a와 p로 나타낼 수 있습니다. 또 그 별칭
(alias, 에일리어스)인 *(a + 0)와 *(p + 0)은 각각 *a, *p로 나타낼 수 있습니다. 이처럼 포인터가 배열
의 첫 번째 요소를 가리키는 경우 그 포인터는 마치 배열처럼 동작할 수 있습니다.
공백 포인터와 NULL
공백 포인터(null pointer)는 객체 포인터, 함수 포인터와는 다른 특별한 포인터입니다. 정수 값 0은 모
든 포인터형으로 형 변환이 가능하고 그 결과는 NULL 포인터입니다. 공백 포인터를 나타내는 것이 공
백 포인터 상수(null pointer constant)라고 하는 매크로 NULL입니다. NULL의 정의는 ‘값 0을 갖는
모든 정수, 상수 또는 상수식을 void *로 형 변환한 식’입니다.
함수 포인터란 변수를 가리키는 포인터가 있는 것처럼 ‘함수를 가리키는 포인터’입니다.
매크로 NULL은 <stddef.h> 헤더에 정의되어 있습니다. 또 <locale.h>, <stdio.h>, <stdlib.h>,
<time.h> 가운데 어느 헤더를 포함해도 선언한 것과 마찬가지로 동작합니다. 아래는 NULL을 정의한
예입니다.
#define NULL 0 /* NULL 정의의 한 예(C/C++) */
#define NULL(void *)0 /* NULL 정의의 한 예(C++에서는 사용할 수 없음) */
int a[5]; 포인터 p는 마치 배열 a처럼 동작합니다.
int *p = a;
p A B C
&a[0] a + 0 &p[0] p + 0
a[0] *(a + 0) p[0] *(p + 0)
&a[1] a + 1 &p[1] p + 1
a[1] *(a + 1) p[1] *(p + 1)
&a[2] a + 2 &p[2] p + 2
a[2] *(a + 2) p[2] *(p + 2)
&a[3] a + 3 &p[3] p + 3
a[3] *(a + 3) p[3] *(p + 3)
&a[4] a + 4 &p[4] p + 4
a[4] *(a + 4) p[4] *(p + 4)
&a[5] a + 5 &p[5] p + 5
각 요소의 포인터를 나타내는 식 각 요소에 접근하는 식
[그림 2C-1] 포인터와 배열
02• 기본 자료구조 55