본문 바로가기

Other Programming/C C++

[C] C는 포인터에 대한 증감 연산을 산술 연산과는 달리 아주 특수하게 수행한다. /포인터 연산

반응형

: PointerType2

#include <Turboc.h>

 

void main()

{

     int ar[]={1,2,3,4,5};

     int *pi;

 

     pi=ar;

     printf("첫 번째 요소 = %d\n",*pi);

     pi++;

     printf("두 번째 요소 = %d\n",*pi);

}

 

크기 5의 ar 배열을 정의했으며 pi=ar 대입문으로 pi가 ar 배열의 선두 번지를 가리키도록 했다. 배열명 자체는 배열의 시작번지를 가리키는 포인터 상수이므로 pi가 이 포인터 상수를 대입받을 수 있다. pi=&ar이 아니며 이렇게 대입해봐야 대입되지도 않음을 주의하도록 하자. pi가 ar 배열의 시작 번지, 그러니까 ar[0]의 번지를 가리키고 있는 상황이다. 이 상태에서 *pi를 읽으면 pi 위치에서 4바이트를 읽을 것이며 이 값을 출력하면 첫 번째 요소 1이 출력된다.

그리고 pi++ 연산문으로 pi값을 증가시켜 ar 배열의 다음 요소로 이동했으며 이 상태에서 *pi를 읽으면 ar[1]의 값이 출력된다. 이 예제의 전체 실행 순서를 그림으로 그려 보면 다음과 같다.

ar[0]와 ar[1]의 값이 각각 출력된다. 너무나 당연한 결과로 보이겠지만 과연 당연한 것인지 특별한 것인지 좀 더 생각해 보자. ar 배열이 할당되는 번지는 실행할 때마다 달라지겠지만 설명의 편의상 1000번지에 할당되었다고 하자. pi가 최초로 대입받은 ar 배열의 시작번지는 1000번지가 될 것이며 1000번지에서 1003번지까지 4바이트를 읽어 ar[0]를 출력했다.

그리고 다음 번지로 이동하기 위해 pi++ 연산을 했는데 이 연산에 의해 pi는 1001번지로 이동해야 한다. 1000에다 1을 더하면 1001이 된다는 것은 초등학생도 다 아는 산수다. 그러나 1001번지는 배열에 속해 있기는 하지만 아무런 의미가 없는 값이다. ar[0]도 아니고 ar[1]도 아니고 두 요소에 걸쳐있는 애매한 번지인 것이다.

이 번지의 값을 읽어서는 ar[1]의 값을 구할 수 없음은 물론이고 이것도 저것도 아닌 이상한 값이 읽혀질 것이다. 그래서 C는 포인터에 대한 증감 연산을 산술 연산과는 달리 아주 특수하게 수행한다.


T 포인터 변수 px 정수 i 더하면

px=px+(i*sizeof(T)) 된다.





포인터끼리 더할 수 없다.

포인터끼리 뺄 수 있으며 연산 결과는 정수이다.

포인터와 정수의 가감 연산은 가능하며 연산 결과는 포인터이다.










 
#include 

void main()
{

	int ar[] = {1,2,3,4,5};
	int* pt1,*pt2,*pt3;

	pt1 = &ar[0];
	pt2 = &ar[4];
	pt3 = pt1 + ((pt2-pt1)/2);

	printf("%d", *pt3);

}
-winapi.co.kr