티스토리 뷰

잘못된 코드

#include <stdio.h>

void swap(int a, int b);

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

    swap(x, y);
  printf("x: %i, y: %i\n", x, y); // 여전히 x는 1, y는 2
}

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

위 코드는 swap함수 안의 a와 b의 값을 바꾸기는 하지만, main 함수 안에 x와 y는 바꾸지 못한다. 왜냐면 swap함수로 전달되는 값은 복사된 값(pass by value)이기 때문이다. (참고로 C언어는 자바스크립트나 파이썬과 같은 언어와 달리 전부 pass by value로 넘어간다. object랑 비슷하게 생긴 struct도 마찬가지다.) 그러므로 swap함수 안에서 일어나는 교환은 x, y와 전혀 상관이 없고 영향을 주지 않는다. 이 x, y 값을 바꾸려면 값이 아닌 주소를 아규먼트로 전해줘야 한다. (pass by reference)

수정된 코드

#include<stdio.h>

void swap(int a, int b);

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

    swap(&x, &y);
  printf("x: %i, y: %i\n", x, y); // x는 2, y는 1
}

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

위 로직은 다음과 같다.

  • 스왑함수의 아규먼트로 x와 y의 주소를 전달한다. (&x, &y)
  • swap함수의 패러미터는 포인터 변수로 정의한다. 주소를 입력받을 것이기 때문이다.
  • *a 는 _변수 a가 가리키는 주소로 가라_는 뜻이다. 그러면 main 함수에서의 x값이었던 1을 얻을 수 있고, 이를 tmp 변수에 저장한다.
  • *b는 _변수 b가 가리키는 주소로 가라_는 뜻이고, main함수에서 y값이었던 2를 얻을 수 있다. 이 값을 a의 주소가 가리키는 값으로 할당한다. 즉 이제는 a가 가리키는 주소로 가면 2라는 값이 있도록 한다.
  • 마지막으로 tmp에 저장되어있는 1 값을 b가 가리키고 있는 주소에 할당한다. 즉 이제는 b가 가리키는 주소로 가면 1이 있도록한다.
  • 결과적으로 x가 가리키는 주소에 있는 값은 2, y가 가리키는 주소에 있는 값은 1이 되어 성공적으로 swap된다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함