easy software

C언어 포인터 기본 개념 본문

C언어/포인터와 배열

C언어 포인터 기본 개념

JAVA 웹개발자 2015. 1. 15. 15:41

안녕하세요. 이번 시간에는 C언어의 꽃이며 끝이라 불리우는 포인터에 대해 이야기 해보려 합니다.

 

아주 간단하게 설명하자면, 포인터란 주소값을 저장하는 변수이며 주소값 저장이 완료되면 그 주소값

 

을 가르키는 형식이라고 말씀드릴 수 있습니다.

 

포인터의 선언은?

 

type*    ptr;

type    *    ptr;

type    *ptr;

 

어느거나 해도 상관없습니다. type부분에는 자료형을 적어주시면 됩니다.

 

위에서 포인터는 주소값을 담는 역할을 한다고 했었죠?

 

그럼 변수의 주소값을 어떻게 포인터변수에 저장할 수 있을까요?

 

바로 &연산자를 이용해서 저장할 수 있습니다.

 

int a = 10;

 

int* ptr = &a;

 

이렇게 작성하면 'int 형 변수 a의 주소를 int형 포인터 변수 ptr에 저장하겠다' 라는 뜻이 됩니다.

 

그럼 아래의 그림처럼 ptr이 a를 가리키게 됩니다.

 

 

 

 

즉, a = = *ptr 이 되는 셈이지요.

 

a = 20; 으로 작성하면 a는 10에서 20으로 값이 변경되겠지요?

 

*ptr = 20; 으로 작성해도 a는 10에서 20으로 값이 변경됩니다.

 

단!! ptr에 &를 이용한 주소값 저장이 아닌 100같은 상수를 넣으면 어떻게 될까요?

 

int* ptr = 100;

 

위의 코드를 두줄로 나누어보면

 

int* ptr;

 

*ptr = 100;

 

이 됩니다.

 

ptr이란 포인터변수는 어떤 주소값을 가리키고 있겠죠?

 

초기화를 하지 않았기 때문에 쓰레기값이 저장되어 있을 것입니다.

 

그런데, 그 쓰레기값이 메모리의 어떤 부분인지 알 수 있나요?

 

아무도 알 수 없겠죠?

 

물론 쓰레기 값이라서 크게 걱정하지 않아도 되지만

 

어떤 응용프로그램의 한 부분일 수도 있습니다!

 

그러므로 ptr이 가리키고있는 주소값에 있는 실제 값이 100으로 변경되면!

 

어떤 프로그램에 이상동작이 발생할 수도 있습니다!

 

그럴일은 아주 적겠지만, 때때로 아주 위험한 일이니 주의하시기 바랍니다!

 

 

포인터변수에는 왜 type이 정해져있나요?

 

위에서 보시면 int형 변수의 주소는 int형 포인터 변수에 저장했습니다.

 

double형은 double형에 저장하는 것도 유추할 수 있겠죠?

 

왜 그럴까요?

 

만약 아래의 코드처럼 작성했다고 가정합시다.

 

int a = 10;

 

double* ptr = &a;

 

printf("%f", *ptr);

 

어떻게 될거같나요? 컴파일은 됩니다! 다만...

 

ptr은 double형 포인터이기 때문에 a의 주소로 가서 8바이트의 double형으로 값을 가져올 것입니다.

 

그런데 int형은 4바이트죠?

 

정수10은 4바이트에 걸쳐서 저장되어있는데, 8바이트 형으로 가져오는 것은 분명 문제가 있습니다.

 

메모리를 오버해서 가져오게 되는것이죠.

 

저러한 문제가 있기 때문에 같은 타입의 포인터 변수를 선언하는 것입니다.

 

이정도면, 포인터의 아주 기본중의 기본은 마무리 한 것 같군요!

 

이제 간단한 예제를 해볼까요?

 

아래의 코드를 보고 출력결과를 예상해보세요!

 

#include <stdio.h>

 

int main(void){

 

int n = 10;

int *p1 = &n;

int *p2 = p1;

 

printf("%d \n", (*p1)++);

printf("%d \n", (*p2)++);

printf("%d \n", n);

 

return 0;

}

 

이 코드는 위의 내용을 이해했다면 아주 간단하게 풀 수 있는 예제입니다.

 

*p1은 n을 가리키고있습니다.

 

즉, *p1 = = n; 이죠

 

그리고 *p2도 n을 가리키고 있습니다!

 

그림 보시죠.

 

 

첫번째 출력문에서 *p1의 값을 증가시키고 있습니다. 이것은 곧 n의 값을 증가시키는 것입니다.

 

단! 주의할 사항이있다면, ++ 연산자는 *연산자보다 우선순위의 연산자입니다.

 

그러므로 반드시 *연산자를 사용할 때에는 괄호로 묶어주세요~

 

출력 후 값을 1증가시키므로 처음엔 10이 출력되면서 n은 11이 됩니다.

 

두번째 출력문에서는 *p2를 출력후 증가시키라고 합니다.

 

즉, 11이 출력되고 n은 12가 됩니다.

 

마지막은 12가 출력됩니다.

 

 

어떤가요? 무척 쉽지않나요?

 

다른 예제나 개념보다 상당히 깊게 설명했는데, 이것으로 이해가 되지않는다면 다른 블로그나 서적을

 

한번 더 찾아보시기 바랍니다.

 

아주 쉽게 이해하실 수 있을거에요.

Comments