예 제 : 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-winapi.co.krvoid 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); }
'Other Programming > C C++' 카테고리의 다른 글
main 함수의 인수 - 출처 : winapi.co.kr (0) | 2009.05.04 |
---|---|
이중 포인터 (0) | 2009.05.04 |
메모리 할당 및 해제 / 재 할당 (2) | 2009.05.04 |
[C] void 포인터 / NULL 포인터 (0) | 2009.05.03 |
[C] AlphaNum 문제 (0) | 2009.04.29 |
[C] 배열명이 단독으로 사용되면 배열의 시작번지값을 가지는 포인터 상수이다. /배열명이 그 자체로 포인터이므로 scanf의 인수로 넘길 때 &연산자를 붙이지 않는다 (0) | 2009.04.29 |
[C] 배열을 정의 할때 sizeof 연산자를 사용하면 유지보수가 쉬워진다 (0) | 2009.04.29 |
[C/C++] ::변수 C#의 this 키워드와 비슷한 개념이라고 보면 될듯 / 지역변수 전역변수 구분 (0) | 2009.04.28 |