C에서 포인터에 덧셈과 뺄셈 연산자를 적용할 수 있다. 이러한 적용 과정을 포인터 산술이라 부른다.
포인터 산술을 이해하기 위해서 다음 규칙을 이해하는 것이 중요하다. 이 규칙을 포인터 산술 규칙이라 부른다.


즉, p에 정수 k를 더하면, 그 결과는 인덱스가 k인 배열 원소의 주소이다. 따라서 (p+k)는 인덱스가 k인 배열 원소를 가리킨다.


다음 프로그램 코드 일부와 그 실행 결과를 생각해보자.

위의 코드에서 첫번째 선언문의 수행 결과로, 5개의 int 값을 연속하여 저장할 수 있는 기억공간이 할당되고, 적절히 초기화된다. 다음에, 두 번째 선언문의 수행 결과로, 주소를 저장할 수 있는 기억공간 p가 할당된다. 세 번째 배정문의 수행 결과로, p는 a[0]의 주소 값을 포함하게 되고, 따라서 a[0]을 가리키게 된다.

여러분이 p에 정수 k를 더하면, 그 결과는 a[k]에 대한 주소이다. 따라서 (p+k)는 a[k]의 원소를 가리킨다.

예를 들면, (p+1)의 연산 결과는 a[1]에 대한 주소 값 1004이며, p(+3)의 연산 결과는 a[3]에 대한 주소 값 1012이다.

여러분은 포인터와의 덧셈이 2주차강의에서 다룬 일반적인 산술 덧셈과 다르다는 것을 유의해야 한다. 즉, 포인터에 더해지는 값의 단위는 배열 원소의 크기이다.

따라서 (p+k)의 연산은 실제로 다음과 같이 수행된다.

    (p + k * 배열 원소의 크기)

p가 가리키는 배열 원소의 타입이 int이므로, (p+k)는 다음과 같이 계산된다.

    (p + k*4)


만약, p가 가리키는 배열의 원소 타입이 double이면, (p+k)는 다음과 같이 계산될 것이다.

    (p + k*8)

배열 원소에 대한 크기는 컴파일러에 의해서 자동으로 고려되기 때문에, 프로그래머 관점에 볼 때 중요한 것은 (p+k)를 다음과 같이 이해하는 것이 중요하다

   

p가 가리키고 있는 배열 원소로부터 다음 k 번째 배열 원소를 가리킨다.


예를 들면, p가 a[0]을 가리키고 있다면, (p+2)는 다음 2번째 원소 a[2]을 가리킨다. 그러나 p가 a[1]을 가리키고 있다면 (p+2)는 a[3]을 가리킨다.

포인터에 대한 뺄셈도 가능하다. 그 의미는 포인터에 대한 덧셈과 유사하게 해석될 수 있다. p가 포인터이고, k가 정수일 때, (p-k)는 다음과 같이 해석된다.

   

p가 가리키고 있는 배열 원소로부터 이전 k 번째 배열 원소를 가리킨다.


따라서 p가 a[2]를 가리킬 때, (p+1)은 a[3]을 가리키고, (p-1)은 a[1]을 가리킨다.


포인터 산술 연산에서, *, /, % 등의 연산자를 사용하는 연산은 의미가 없다는 것을 알 수 있을 것이다. 따라서 이러한 연산자와의 포인터 연산은 허용되지 않는다.

또한, 포인터 산술 연산에서 +, -의 연산자 사용도 제한된다. 여러분은 위에서 살펴보았듯이, 포인터로부터 정수를 더하거나 빼는 경우에 허용된다.

예를 들면, 정수로부터 포인터를 빼는 경우나, 두 개의 포인터를 더하는 경우는 의미가 없으며, 따라서 허용되지 않는다.



top으로... 다음페이지로.. 이전페이지로.. home으로..