2013년 11월 25일 월요일

[C] 포인터(Pointer)에 대해서

들어가며

많은 분들이 C언어의 포인터를 어려워하십니다. 저 역시 그랬구요.

하지만 지금 되돌아보면
사실 간단한 것인데 주변에서 어렵다 어렵다 하니
저도 그렇게 생각했었던 것 같더라구요

이 글은 포인터를 어려워하시는 분들에게 도움을 드리고 싶어서
포인터에 관한 제 생각을 써보았습니다


왜 포인터를 쓰는 것 일까요?



  • 이 글을 읽고 왜 포인터를 사용하는지 생각해봐요

만약 여러분이 학교나 회사에 갈 때 집을 들고 다닌다면 어떨까요?















바닥에 고정되어있는데다가 너무 무거우니 아무도 그런 것은 하고 싶지 않을거에요










소라개나 달팽이같은 동물들은 집이 무거워서 빠르게 다니지 못해요 ㅠ,ㅠ


그래서 우리는 이런 느린 동물들처럼 집을 들고다니는 대신 주소를 외우고 다니지요

그 편이 훨씬 효율적이고 빠르잖아요 ㅎㅎ


이제 이것을 컴퓨터에 적용시켜보도록 해요


배열이나 구조체같은 것은 변수들을 많이 저장할 수 있어요

변수들에게 집이나 마찬가지이지요

그런데 그런 배열이나 구조체를 변수들이 직접 가지고 다니고 싶어할까요?


물론 컴퓨터를 만들때 굳이 그렇게 시킨다면

변수들을 속으로 울면서도 힘내서 자기들의 집을 들고 다니겠죠

하지만 그렇게하면 분명 컴퓨터가 느려질거에요

여러분은 그런 느린 컴퓨터를 사용하고 싶으신가요?

컴퓨터는 여러분을 기다리게 하지않기 위해서

주소를 적어놓은 변수(포인터)를 쓰는거랍니다.


컴퓨터의 주소는 어떻게 쓸까요?

  • 여기서부터 변수를 종이, 값을 내용이라고 쓸거에요
  • 예제 1과 예제 2를 비교해보아요

예제 1) 포인터를 사용하지 않는 예제



















이 코드를 실행하면 어떤 결과가 나올까요?










이제 이 결과가 왜 이렇게 나왔는지 생각해보도록 해요

우선 우리는

int Value = 10;

이라는 코드를 썼어요.

이것은 Value라는 종이에 10이라는 내용을 쓴 거에요

















그 다음에 실행될 코드는

Increase(Value);

네요. 여기서 main함수의 Value에서 Increase로 Input으로 내용을 전달해요
















이제 Increase함수 안의 코드를 살펴봐요

Input = Input + 1;

Input 이라는 종이에 적힌 내용에 1을 더하고 있어요















하지만 1을 더한 것은 Input이라는 종이이기때문에

Value 종이에는 그대로 10이라고 써있네요

그래서

printf("Value : %d", Value);

를 했을때 10이 나온 것이에요

그럼 여기서 포인터를 사용하면 어떻게 될까요?



예제 2) 포인터를 사용하는 예제




















이 예제의 결과는 어떨까요?










예제 1의 결과와 다른 점이 보이시나요?

예제 1에서는 결과가 10 이었지만

몇 글자를 더 추가한 이 예제는 결과가 11이에요.

이제 예제 2가 왜 이런 결과를 냈는지 설명해드릴께요


main함수의 맨 첫번째는 예제 1과 똑같아요

int Value = 10;

















그런데 두번째 코드는 약간 달라진 점이 있어요

Increase(&Value);

왜 &라는 것을 더 추가했을까요?

왜냐하면 &는 주소를 가르쳐주기때문이에요!
















이제 Input은 Value의 주소를 내용으로 가지고 있어요

그 다음 Increase함수의 내용을 보면

*Input = *Input + 1;

이라고 써있네요.

&이 주소를 가르쳐주는 연산자라면 *는 어떤 연산자일까요?

바로 주소를 따라가는 연산자에요

즉, *Input은 Input에 적힌 주소를 따라가서 Value를 데려오는거에요

















Increase함수에 있던 Input이

주소를 보고 main함수의 Value를 직접 데려와 1을 더해서

printf("Value : %d", Value);

이 코드에서 Value의 내용이 1 늘어난 11 인거에요

이해가 되셨나요?

만약 이해가 않되신다면 직접 코드를 짜서 실험해보면 도움이 될거에요 ㅎㅎ



포인터를 사용하려면 어떻게 해야할까?

포인터를 실제로 사용하려면 딱 세 가지만 알고 있으면 되요
  • int*은 int의 주소를 저장하는 타입
  • &는 주소를 가르쳐주는 연산자
  • *는 주소를 따라가서 데려오는 연산자

이 세 가지만 알면 포인터에 대해서 더 이상 알 것이 없어요. 참 쉽죠?

댓글 없음:

댓글 쓰기