컴퓨터의 메모리는 일반적으로 아래처럼 공간을 나누어 사용된다.
- 머신코드 (clang 명령어 처럼 실행 시 100101 형태로 저장하는 코드)
- 전역변수
- 힙 ( malloc() 처럼 메모리를 동적으로 할당할때 사용되는 부분)
- 스택 ( main()함수, void()함수 등..)
아래 코드를 실행해보면 x, y 값이 똑같이 출력된다.
#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); // x is 1, y is 2
swap(x, y);
printf("x is %i, y is %i\n", x, y); // x is 1, y is 2
}
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
왜그럴까?
main()함수의 변수들은 main()함수 메모리 영역에 저장되지만 (x, y)
swap()함수의 변수들은 swap()함수의 메모리 영역에 저장된다. (a, b)
- 즉, 서로 다른 메모리 공간에 저장되기 때문에, swap()함수는 a와 b의 값만 바꿨다.
포인터를 이용해서 해결해주면 된다.
#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); // x is 1, y is 2
swap(&x, &y);
printf("x is %i, y is %i\n", x, y); // x is 2, y is 1
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
a와 b를 각각 x, y를 가리키는 포인터로 지정함으로써 swap()함수가 x, y의 값을 바꿀 수 있도록 해주었다.