[C] 포인터를 이용해 두 변수의 값을 서로 바꿔보자

piopiop·2021년 1월 8일
0

C

목록 보기
1/9
#include <stdio.h>

void swap(int a, int b);

int main(void)
{
    int x = 1;
    int y = 2;
    
    printf("x is %i, y is %i\n", x, y);
    swap(x, y);
    printf("x is %i, y is %i\n", x, y);
}

void swap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

위 코드는 변수 x와 y의 값을 서로 바꾸기 위해 짠 코드이다.
과연 x와 y의 값은 바뀌었을까?

출력값을 확인해보면 바뀌지 않았다. 왜 바뀌지 않았을까?
그 이유는 바로 swap함수는 x, y의 복사된 값을 인자로 받은 a, b를 서로 바꿨을 뿐이지 실제 x와 y를 바꾸지 않았기 때문이다.
프로그램 내 함수와 관련된 것들은 메모리안에서 스택(stack)이란 영역에 저장이 되는데 위 코드를 실행하면 stack에서는 아래와 같은 일이 벌어진다.

main이 호출되면 스택에 x, y 두 변수를 위한 영역이 할당되고 각각 1과 2로 초기화된다.
이어서 swap이 호출되면 기존의 영역 위에 a, b, tmp를 위한 영역이 쌓이게 된다.
이어서 a와 b의 값이 바뀌고 swap함수가 끝나면 a, b, tmp가 있던 영역이 사라지게 된다.
하지만 이때 x, y는 전혀 영향을 받지 않았기 때문에 우리가 원하던 결과를 얻을 수 없던 것이다.

이를 해결하려면 어떻게 해야될까?
방법은 a와 b에 x, y의 값 대신 x, y가 저장된 곳의 주소를 저장하는 것이다.
코드는 아래와 같다.
swap의 인자에 x, y의 주소인 &x, &y를 넣어주었다.
이때 int *a에서 inta가 int값을 가리키고 있다는 뜻이고 *은 a가 포인터임을 뜻한다.

#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
    int x = 1;
    int y = 2;

    swap(&x, &y);
}

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

x, y는 각각 1, 2로 초기화되어있고 a와 b는 x와 y를 가리키고 있다.
int tmp = *a
tmp를 a가 가리키는 값으로 초기화한다. 즉 tmp는 1이 된다.
*a = *b
a가 가리키는 곳에 b가 가리키는 값을 저장한다. 즉 a에 2를 저장한다.
*b = tmp
이어서 b가 가리키는 곳에 tmp의 값을 저장한다. 즉 b에 1을 저장한다.

다시 출력해보면 우리가 원하는 결과를 얻은 것을 알 수 있다.


이제 포인터와 친해져야 할 시간이다.

이 게시글은 부스트코스 CS50 복습차원에서 작성되었습니다.

피드백 환영합니다.
-끝-

profile
piopiop1178@gmail.com

0개의 댓글