C언어의 포인터에 대한 간단한 설명

이 포스트에서는 C언어에 사용되는 포인터에 대한 간단한 설명을 서술합니다.

C언어 프로그래밍을 강력하게 만들어주어 ‘C언어의 꽃’이라고도 불리고, 또 여기서 어려움을 느껴 포기하는 초심자들도 많은 것으로 알려져 있는데, 간단히 설명하면 어떤 값을 가리키기 위한 형식을 말합니다.
어느 프로그래밍 언어나 다 마찬가지겠지만 변수를 선언하면 그 값은 메모리에 저장이 됩니다. 우리가 사는 집이나 직장, 학교 등의 건물을 보면 번지수가 지정되어 있듯이 변수도 선언이 되면 메모리 주소로 나타낼 수 있는 특정한 위치에 저장이 됩니다. 그 변수가 저장된 위치를 지정하기 위한 형식이 바로 포인터입니다.

#include <stdio.h>

int main()
{
    int panty, sword;
    int *pp, *ps;
    pp = &panty, ps = &sword;
    printf("    pp: %p,     ps: %p\n", pp, ps);
    printf("&panty: %p, &sword: %p\n\n", &panty, &sword);
    panty = 10, sword = 20;
    printf("타잔이 %d원짜리 팬티를 입고 ", *pp);
    printf("%d원짜리 칼을 차고 노래를 한다. 아아아~\n", *ps);
    *pp += 10, *ps += 10;
    printf("타잔이 %d원짜리 팬티를 입고 ", panty);
    printf("%d원짜리 칼을 차고 노래를 한다. 아아아~\n", sword);
    return 0;
}

이 코드에서 5번 줄은 일반 정수 변수를 선언한 부분이고, 6번 줄이 포인터 변수를 선언한 부분입니다. 포인터는 변수 이름 앞에 *표를 붙입니다. 7번 줄은 포인터 변수가 가리킬 변수를 지정하는 부분인데, 이 때는 포인터 변수 이름 앞에 *표를 떼고 가리킬 변수 이름 앞에 &표를 붙여서 대입합니다.

8번 줄은 포인터 변수의 값을 출력하고, 9번 줄은 그 포인터 변수가 가리키는 값의 주소를 출력합니다. 포인터 변수는 그 변수가 가리키는 값의 주소이므로 8번 줄과 9번 줄은 같은 값을 출력합니다.

10번 줄에서는 원래 변수에 값을 직접 대입하고, 11번 줄과 12번 줄에서는 포인터 변수를 통해 원래 변수의 값을 참조하여 출력합니다. 포인터 pp는 변수 panty의 값을, 포인터 ps는 변수 sword의 값을 참조함으로써 10과 20이 각각 출력됩니다.

13번 줄은 포인터를 통해 원래 변수의 값을 바꾼 것인데, 이를 역참조라고 부릅니다. 여기서는 pp와 ps가 가리키는 변수의 값을 10 더하라는 의미인데, pp는 panty를 가리키고 있고 ps는 sword를 가리키고 있으므로 결과적으로는 panty와 sword의 값이 원래 값에서 10씩 더해지게 됩니다. 14번 줄과 15번 줄은 11-12번 줄과 같지만 출력할 변수를 포인터 참조가 아닌 그 변수 이름으로 직접 지정한다는 점이 다릅니다.

이를 실행하면,

    pp: 0x7eba1544,     ps: 0x7eba1540
&panty: 0x7eba1544, &sword: 0x7eba1540

타잔이 10원짜리 팬티를 입고 20원짜리 칼을 차고 노래를 한다. 아아아~
타잔이 20원짜리 팬티를 입고 30원짜리 칼을 차고 노래를 한다. 아아아~

이와 같이 출력됩니다.
주: 위 결과에서 변수 주소는 저 값으로 고정되는 것이 아니고 실행할 때마다 바뀌게 됩니다. 또한, 32비트 아키텍처에서는 위와 같이 8자리로 표시되지만 64비트에서는 최대 16자리로 표시됩니다.

그러면 번거롭게 포인터를 왜 쓰느냐 하는 의문이 제기될 수 있겠는데, 포인터를 사용해서 얻는 장점이 많기 때문입니다. 포인터 덕분에 간결하고 효율적인 처리가 가능하고 더 빠르고 최적화된 기계어 코드를 생성할 수 있으며 복잡한 자료 구조와 함수의 접근도 쉬워집니다. 하지만 메모리 주소를 직접 제어한다는 점 때문에 잘못 사용하면 오류가 나기 쉽다는 단점도 있긴 하지만 장점이 더 많기 때문에 포인터를 사용하는 것입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.