본문 바로가기

it관련

C언어의 포인터 개념에 대하여

반응형

C언어에서 가장 필수적인 개념이지만 가장 어려워 하는 포인터에 대해서 쉽게 

설명해보겠습니다. 어려워하는 이유는 c언어 관련서적에서 포인터의 개념을 제대로 

설명하지 못해서 그렇습니다.


포인터(pointer)란 데이터의 주소를 가지고 있는 변수이며 단어 자체의 뜻은 가리킨다는 

뜻으로 쉽게 말하자면 어떤 곳를 가리키는 변수면서 가리키고 있는 곳의 주소값을 가지고 

있습니다.


먼저 포인터를 선언하는 방법부터 알아보도록 합시다.

int형 포인터 p를 선언하고 p가 변수 s를 가리킨다고 가정하면


int *p;

p=&s;


하거나


int *p = &s;


이렇게 선언을 해주시면 됩니다.

여기서 반드시 주의하셔야 하는 것은 포인터의 자료형과 포인터가 가리키고 있는 변수의 

자료형은 동일해야 합니다.

즉, int형 포인터라면 int형 변수를 가리켜야 하는 것이죠.


s의 주소가 4라고 가정을 해봅시다

그러면 그림은




여기서 포인터 변수 p의 주소값은 임의로 잡았습니다


p가 가지고 있는 값 4는 변수 s의 주소값이 됩니다

즉, p=4; 입니다

*p는 p가 가리키고 있는 변수 속에 있는 값을 말합니다

즉, *p=10; 입니다

(참고로 *는 간접 참조 연산자라고 합니다)


이것을 동그라미 그림으로 표현해보면




printf("%d", p); 와 printf("%d", &s); 의 출력값이 같고

printf("%d", s); 와 printf("%d", *p); 의 출력값이 같습니다


만약 p를 p++; 해서 하나 증가시키면 p의 값은 어떻게 될까요?

p가 4라고 가정할 때,

p가 int형이므로 p의 값에서 int 자료형의 크기 4를 증가시킨 8이 됩니다

즉, p+1 = 8, p+2 = 12, p+3 =16 이렇게 증가가 되죠.


*p++; 하게 되면 어떻게 될까요?

p뒤에 붙는 ++은 p에 적용되서 마찬가지로 p의 값이 증가합니다

*p 을 증가시키길 원하면 (*p)++; 해주셔야 됩니다


참고로 

s = *++p; 는 p를 증가시킨 후에 p가 가리키는 값을 s에 넣어줍니다

s = *p++; 는 p가 가리키고 있는 값을 s에 대입한 후에 p를 증가시킵니다

p앞에 붙어있는 ++은 전위연산자를 의미하고 p 뒤에 붙어있는 ++는 후위연산자를 

의미하는데, 전위연산자는 등호보다 앞서서 실행되고, 후위연산자는 등호가 실행된 뒤 실행됩니다


이제, 포인터와 배열의 관계를 알아보도록 합시다

배열의 이름 변수는 배열의 0 번지의 주소값을 의미하면서 동시에 배열의 

0번지를 가리키는 포인터라고 생각할 수 있습니다

int형 배열 a[3] 가 있다고 가정할 때,




여기서 *a는 a[0]을, *(a+1)는 a[1]을, *(a+2)는 a[2]을 의미할 수 있습니다

왜냐하면 a가 4라고 가정할때 a+1은 int형 자료형의 크기만큼 증가시켜서 8이므로 8번지에 있는 a[1]의 주소값을 의미하기 때문입니다

반응형

'it관련' 카테고리의 다른 글

가상현실에 대하여  (0) 2017.05.05
노트북의 종류  (0) 2017.05.05
포맷이란?  (0) 2017.05.05
노트북 그래픽카드 (GPU) 별 등급  (0) 2017.05.05
그래픽카드& 모니터 인터페이스의 종류  (0) 2017.05.05