본문 바로가기

C/C++/예제

[C 예제] 포인터를 이용해 두개의 변수 값을 서로 바꾸기 ! ( SWAP )

반응형

C 예제.

포인터를 이용해 두개의 실제 값을 바꿔보자 !!

SWAP 함수의 구현 !



해당 예제는 포인터를 배우기 시작할때 한번쯤은 해보는

단골손님으로 main 함수에서 입력받은 두개의 값이 담긴 변수를 swap 함수에게 전달해

swap 함수에서 각각의 변수에 담긴 값을 바꿔주고~ main 함수에서 해당 결과를 출력해보는

예제 입니다.


간단하니까 빠르게 시작합시다 !


자 우선 포인터를 사용하지 않은 상태에선 어떻게 되는지부터 볼까요 ?


#include 

void swap(int n1, int n2);

int main()
{
    int n1 = 0, n2 = 0;

    printf("Input 2 Num : ");
    scanf("%d %d", &n1, &n2);

    printf("Input n1[%d]  n2[%d]\n", n1, n2);  // 입력 받은 값을 확인차 출력을 해요.

    swap(n1, n2); // swap 함수를 호출해서 값을 넘겨요~

    printf("Swap  n1[%d]  n2[%d]\n", n1, n2); // swap 함수를 다녀온뒤의 변수들의 값은 과연 !?

    return 0;
}

void swap(int n1, int n2) // 함수를 호출할때 전달해준 값을 n1, n2 에 채워준다는 뜻인거 아시죠 ?
{
    int temp;  // 임시 저장공간 !! n1 과 n2 의 값을 서로 맞바꾸기 위해 선언 했습니다.

    temp = n1;   // 먼저 temp 에 n1 을 대입하고~
    n1 = n2;      // n1 은 temp 에 있으니 이제 안심하고 n1 에 n2를 대입 !
    n2 = temp;  // n2 의 값도 n1 로 이동 됐으니 이제 n2 에 temp에 저장되있는 n1 의 값을 대입 !!
    printf("!!!!! n1[%d]  n2[%d]\n", n1, n2);  // 서로 맞바꾼 값을 확인차 출력 !!
}

이렇게 포인터를 사용하지 않고 ~ 코딩해서 실행을 해보니 ㅠㅠ 아뿔싸...


소스를 보고 그림을 보시면 아시겠지만..

출력 결과의 밑에 두줄을 보시면...

!!!! 부분은 swap 함수 안에서 n1 과 n2 의 값을 맞바꾼뒤 출력 한겁니다.

제대로 값이 바뀐게 확인이 됩니다 !!

하지만 swap 함수를 빠져나와서 다시 main 에서 출력을 하니까 !!!!

값이 다시 원래대로 돌아왔어요 ㅠㅠ..

왜인지는 다들 아시겠지만 ~ 아는척 하고싶으니까 한마디 할게요 ㅋ_ㅋ


이건 swap 함수에 있는 n1, n2 와 main 함수에 있는 n1, n2 와 서로 다른 변수이기 때문입니다.

좀더 다르게 말하자면 main 함수에서 swap 함수를 호출하면서 전달한건

n1, n2 가 갖고 있는 1과 2라는 값만 보내준 것이기 때문에 swap 함수에서 변경을 하든 말든 main 함수에 있는

n1 과 n2 라는 변수가 갖고 있던 1 과 2라는 값에는 전혀~ 변경이 되지 않는 것입니다.


그럼 swap 함수에서 변경한 것들을 main 에서도 똑같이 적용이 되게 하려면 !?

여기서 포인터가 들어가는거죠 ~ !


소스를 통해 알아봐요 !!


#include 

void swap(int *n1, int *n2);
/* 아까는 swap(int n1, int n2); 였는데 지금은 별딱지( * )가 붙었죠 ?
   별딱지를 붙여서 선언해주면 그건 얘는 포인터 변수 라는 뜻 입니다.
   주소값을 저장하는 변수라는 뜻이지요 ? */

int main()
{
    int n1 = 0, n2 = 0;

    printf("Input 2 Num : ");
    scanf("%d %d", &n1, &n2);

    printf("Input n1[%d]  n2[%d]\n", n1, n2);

    swap(&n1, &n2);
    /* 짠! 여기도 보시면 위에 있던 소스랑 조금 다르죠 ?
       & 의 의미는 scanf 함수를 배우셨을때 들으셨을거에요.
       변수 앞에 & 이 붙으면 그건 해당 변수가 가진 값을 의미하는게 아니라
      해당 변수의 주소지를 의미 하게 됩니다.
      함수를 호출할때 &n1 을 했으니 n1이 갖고 있는 값이 아닌 n1의 주소지가
     넘어가게 되겠죠 ~ ? */

    printf("Swap  n1[%d]  n2[%d]\n", n1, n2);

    return 0;
}

void swap(int *n1, int *n2)
{
    int temp;

    /* 자 이제 main 함수에서 n1 과 n2 의 주소지를 넘겨 줬으니 
       swap 함수의 역할을 수행하기 위해 값을 변경 해야겠죠 ?
       변수를 선언할때 별딱지( * ) 를 붙이면 이건 포인터 변수다 라는 뜻이지만
       이렇게 아래 처럼 대입을 하는 부분에서 포인터 변수 앞에 별딱지를 붙이게되면
       요건 해당 포인터 변수가 갖고 있는 값을 나타냅니다. */
       
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;

    printf("!!!!! n1[%d]  n2[%d]\n", *n1, *n2);
    // 여기서도 우린 서로 바뀐 값을 출력하고 싶은거니까 주소지가 아닌 값이라는 뜻으로
    // 별딱지를 붙여줍니다.
}


요렇게 처음의 소스에 포인터를 활용하게끔 수정을 해주고

실행을 해보면 !?

처음이랑 다르게 main 함수에서 출력한 결과도

swap 함수에서 출력했을때와 동일하게

n1 과 n2 의 값이 변경돼서 출력 됩니다 !!


참 쉽죠 !?


이런 결과가 나올수있게된 이유는 !?

바로 main 함수로 부터 값 만 받아왔던 처음과는 다르게

이번엔 포인터를 이용해 main 함수에 있는 n1 과 n2 라는 변수의 실제 주소지를

넘겨 줬기 때문 입니다.


그로인해 swap 함수에서 값을 서로 바꿔준 결과가

main 함수에 있는 n1 과 n2 변수에도 적용이 된것이죠~!


혹시나 이해가 안가거나 궁금하신사항 또는 설명이 부족하다 싶은게 있다면

언제든 댓글 달아주세요 ~



반응형