(지금 포인터란 개념이 어려워도 스트레스 받지 말자. 많이 접하다 보면 익숙해진다.)
포인터란 무엇일까?
일상생활에서의 포인터는 어떤 화면을 가리키는 불빛이 나오는 물건 등으로 생각할 수 있다.
프로그래밍에서도 같은 의미로 쓰인다.
다시 말해, 프로그래밍에서 포인터는 '어떤 변수를 가리키는 변수'이다.
그럼 가리킨다는 의미란 무엇일까? 손가락도 없는데 어떻게 가리킨다는 것일까?
이를 알기 위해서는 주소값이란 개념을 알아야 한다.
모든 변수는 자체의 값만이 아니라, 주소값도 가지게 된다.
변수의 주소값은 컴퓨터에 의해 임의로 정해진다.
우리는 주소값을 이용하여 어떤 변수를 가리키게 하고, 한 변수의 값을 다른 변수로 바꿀 수 있다.
주소값을 이용해서 어떤 변수를 가리키게 하기 위해
우리는 포인터 변수라는 것을 이용한다.
포인터 변수는 '다른 변수의 주소값을 자신의 변수값으로 가지는 변수'이다.
쉽게, 다른 변수를 가리키기 위해서 다른 변수의 주소값을 가진다는 이야기이다.
위 그림에서 포인터 변수 ptr은 num의 주소값을 가지고 있다.
int num = 20;
int* ptr = #
위 그림 변수와 포인터 변수를 C언어로 표현하면 이렇게 된다.
int*는 간단하게 포인터형 자료형으로 기억해도 된다.
int* ptr; 의 뜻은, 'int형 변수의 주소를 저장할 변수 ptr을 선언한 것'이다.
&num은 간단히 num의 주소값이라는 뜻이다.
그래서, int* ptr = &num은 'int형 변수의 주소를 저장할 ptr변수에 num의 주소를 대입한 것'이다.
int num = 20;
int* ptr = #
printf("%d", *ptr);
위 코드에서 출력 결과를 보면 20이 나온다.
위 printf에서의 *(애스터리스크)는 변수의 주소를 저장하겠다는 자료형을 작성할 때 int* 와는 다르다.
선언한 이후에 *ptr처럼 쓰면, 이것은 포인터 변수 ptr이 가리키는 곳의 값을 의미한다.
바로 이렇게 말이다.
int num = 20;
int* ptr = #
(*ptr) = 30;
위 코드에서는 ptr이 가리키는 곳의 값, 즉 num의 값을 30으로 바꾼다.
근데 num의 값을 직접 바꾸지 않고 num의 주소를 가지는 ptr 변수를 이용해서 바꿨다.
정말 혁명적인 개념이지 않은가?
위 코드처럼 우리는 이러한 포인터 변수를 이용해 다른 변수를 이용해서도 값에 접근할 수 있다.
#include <stdio.h>
int main(void)
{
int n1 = 100;
int* p;
p = &n1;
printf("주소(Address) : %p, %p\n", p, &n1);
printf("내용(혹은 값) : %d, %d\n", *p, n1);
for (int i = 0; i < 5; i++)
printf("%4d", (*p)++);
printf("%4d\n", n1);
return 0;
}
위 글들에서 이해가 됐다면 이 예제가 이해가 될 것이다.
아직 이해가 되지 않아도 괜찮다. 차차 이해하려 노력하다 보면 익숙해질 것이다.
n1이라는 변수와 p라는 포인터 변수의 주소와 값을 비교해보고, p가 가리키는 곳의 값을 변화시켜보는 예제이다.
이해해보려 애쓰고, 또 애써보기 바란다.