2-1장 기본 자료구조 - 배열 : 포인터와 배열 (4/10)

 

해당 내용은 Do it! 자료구조와 함께 배우는 알고리즘 입문 C 언어 편 (전면 개정판)을 기반으로 작성되었습니다.


2-1장 기본 자료구조 - 배열 : 포인터와 배열 (4/10)

포인터 pointer

- 객체 또는 함수를 가르키는 것

int *p; // p는 int형 객체를 가르키는 포인터
double *q; // q는 double형 객체를 가르키는 포인터

 

 

포인터의 자료형

- 포인터가 가르키는 곳의 객체의 자료형을 따라 간다. 

- int*형은 int형 객체를 가르키는 포인터를, double*형은 double형 객체를 가르키는 포인터이다. 

// n이 int형 객체일 때, p가 n을 가리키도록 함
p = &n; // p에 n의 주소를 대입

*p = 999;

- 간접 연산자인 단항 연산자 *를 사용하여 포인터 p가 가리키는 객체의 값에 접근할 수 있다.

- p가 n을 가르킨다면  *p는  p가 가르키는 곳에 있는 n값을 접근하는 식이다. 

 

즉, *p는 n과 같다. 

- p가 다른 객체 x를 가르킨다?  == *p는 x와 같다

 

포인터와 배열

a 값&a[0] 과 같다. 

 

배열 a 와 포인터 p가 선언될 때

p의 초기화는 배열 이름인 a로 할 수 있다. 

 

포인터 p가 배열의 요소 e를 가리킬 때

p + i 는 요소 e의 i개만큼 뒤쪽(오른쪽)의 요소를 가리키는 포인터가 되고,
p - j 는 요소 e의 j개만큼 앞쪽(왼쪽의 요소를 가리키는 포인터가 된다. 
요소 e의 i개만큼 뒤쪽의 요소를 나타내는 *(p + i)는 p[ I ]로 표기할 수 있고,
요소 e의 i개만큼 뒤쪽의 요소를 나타내는 *(p - j)는 p[ -j ]로 표기할 수 있다.
아래 4개의 식은 모두 배열의 각 요소에 접근하는 식이다. 
a[ i ]    *(a + 1)    p[ i ]    *(p + i)  // 첫 번째부터 i개 뒤쪽의 요소

아래 4개의 식은 모두 배열의 각 요소를 가르키는 포인터이다. 
&a[ i ]    a + 1    &p[ i ]    p + i  // 첫 번째부터 i개 뒤쪽의 요소를 가르키는 포인터

 

포인터가 배열의 첫 번째 요소를 가리키는 경우 그 포인터는 마치 배열처럼 동작한다.

즉, 포인터와 배열을 서로 바꾸어 쓸 수 있다.

배열의 최댓값 구하기

주사 traverse

- 배열의 요소를 하나씩 차례로 살펴보는 과정을 알고리즘 용어로 주사(traverse)라 한다. 

- 데이터를 하나씩 지나면서 (달릴 주) 살피고, 조사하는(조사할 사) 일을 말한다. 

- 스캐닝 (scanning)이라고도 한다. 

- traverse = 가로지르다, 횡단하다. 

 

NULL과 공백 포인터

- 공백포인터(NULL pointer)는 객체 포인터나 함수 포인터와는 다른 특별한 포인터이다. 

- 정숫값 0은 모든 포인터형으로 형 변환이 가능하고 그 결과는 NULL 포인터이다. 

- NULL은 값 0을 갖는 모든 정수, 상수 또는 상수식 void*로 형 변환한 식이다.