본문 바로가기

프로그래밍

[C] 포인터(pointer) 간단하게 이해하기

포인터

나는 포인터가 죽어도 안 외워졌다.

나는 포인터가 죽어도 안 외워졌다. C언어의 꽃이라고 불리는 포인터를 이해하기에 조금 오랜 시간이 걸렸다. 간단하게 생각하자.

일단 가볍게 짚고 넘어가자. 포인터(pointer)는 메모리 주소 '값'이다.

*는 값이다.
&는 주소값이다.

* (asterisk)

별
*는 별표다. 별이 붙으면 특별해진다. 군대에서도 별을 달면 대우가 달라진다. 별을 달면 을 나타낸다.

포인터3
num이 가지고 있는 5를 출력하고 싶다면 ptr라는 변수에 *을 붙여서 *ptr로 나타내면 된다.
포인터4

포인터1
그런데, 계급장을 때면, 이 녀석(ptr)은 주소값이 된다. 정말 그런지 ptr만 출력해보자.

포인터2

계급장을 떄면, ptr 변수는 주소값을 가리킨다. 정확하게 말하면, num 변수의 메모리 주소값을 가리킨다. 즉, ptr은 정확히 &num과 일치한다.

여기서 정리하고 가자. 포인터 변수는 주소값을 담는다. 단, *를 붙이면, 주소값이 가리키는 참조값(즉, 5)가 된다.

& (ampersand)

&가 붙으면 무조건 주소값이 된다. 포인터 변수는 무조건 주소값을 담아야 한다. 따라서 특수한 기호 &를 붙여줘야 한다. 이제 아래 그림을 이해하면 된다.

포인터

이 그림에서 생각해야 할 점은 왜 &ptr=0xB냐는 것이다.
&기호는 주소값을 담는 연산자라고 했다. 따라서 &ptr&num의 주소는 서로 다른 것이다. 당연한 말이다.

포인터의 필요성

메모리 주소값을 담는 포인터가 왜 필요하는지에 대한 질문은 나도 진행중이다. 다만, 내가 아는선에서 간단하게 설명하고자 한다면 메모리를 정밀하게 컨트롤 하기 위함이 아닐까 생각하고 있다.

포인터의 필요성에 대해서는 게임프로그래머 김포프씨의 말을 인용하고 싶다. 김포프씨의 말에 따르면, 포인터는 간접적 사고를 할 수 있는 일종의 논리력이라고 말씀하신다.