본문 바로가기
프로그래밍/자료구조

[C언어와 함께 자료구조를] 포인터 활용

by 헬맷쓰다 2015. 3. 10.
반응형

포인터를 이용한 값 교환

   두개의 정수 변수의 값을 교환하는 함수를 생각해 보죠.

   그냥 소스를 먼저 보겠습니다.

void intswap (int a, int b)
{ 
    int t; 
    
    t = a; 
    a = b;
    b = t; 
}

void main ()
{

    int x, y;

    x = 1;
    y = 2;

    printf ("변경 전 : x=%d y=%d\n", x, y);

    intswap (x, y);

    printf ("변경 후 : x=%d y=%d\n", x, y);
}

 자... 그럼 출력은?

변경 전 : 1 2

변경 후 : 1 2

      이런 결과가 나오는 이유는 C언어에서 인수를 함수에 전달할 때, 인수 자체를 전달하지 않고 인수의 복사(copy)본을 전달하기 때문입니다. 이런 방법을 값에 의한 호출(call by value) 라고 합니다. 다음 그림이 intswap()에서 일어나는 일을 보여줍니다.

함수 intswap()은 a, b 복사본의 값을 교환하지만 원래의 변수 x, y에는 아무 영향이 없습니다.

   

 포인터를 이용하여 두 변수의 값을 올바로 하려면 다음과 같이 변경합니다.

void intswap (int *pa, int *pb)
{
    int t;

    t = *pa;
    *pa = *pb;
    *pb = t;
}

void main ()
{
    int x, y;

    x = 1;
    y = 2;

    printf ("변경 전 : x=%d y=%d\n", x, y);

    intswap (&x, &y);

    printf ("변경 후 : x=%d y=%d\n", x, y);
}

달라진 부분은 intswap함수의 파라미터가 int에서 int*로 변경된 것입니다. main에서 intswap 함수의 인자를 보면 x, y의 주소를 넘겼구요. intswap내부에서는 주소의 내용을 바꾸게 됩니다. 결과는 예상대로 값이 교환되어 있겠죠.

변경 전 : 1 2

변경 후 : 2 1
   그림으로 보면 다음과 같습니다.

 

라이브러리 함수에서 사용하는 포인터

  이번에는 라이브러리 함수 중 포인터를 사용하는 함수가 있는데요 대표적으로 scanf()가 있습니다.

scanf()는 사용자의 입력을 받는 함수인데, 인자로 포인터를 사용합니다.

만약 사용자의 부동수점 수와 정수값을 입력받을 때 다음과 같이 처리합니다.

double x; 

int n;

scanf ("%lf, %d", &x, &n);

   많이 하는 실수로 주소연산자를 붙이지 않는 경우가 있으므로 주의 하셔야 합니다.

scanf ("%d", n);

==> 이런 경우 n의 주소에 값을 넣는게 아니라 주소가 n인 메모리에 값을 써버리는 오류가 발생합니다.  

 

이번 시간은 포인터의 전형적인 예를 들어가며 설명을 드렸습니다.

다음 시간에는 문자열과 배열에 대해서 살펴보겠습니다.

 

반응형

댓글