나의 IT일지
함수와 포인터 본문
함수란 나열된 명령의 묶음으로, 함수의 식을 정하는 구현부와 함수를 호출하는 호출부로 나뉜다. 구현부에는 함수 값의 자료형을 나타내는 반환형, 호출부에 함수명과 값을 전달하는 경우, 전달받는 값을 저장하기 위한 변수인 매개변수, 함수의 실행이 마무리되고 나온 값을 함수 값으로 반환하는 return문이 있다.
구현부 | 호출부 |
반환형 함수명(매개변수1, 매개변수2){ 명령1 명령2 ... return 리턴값;} |
함수명(값1,값2); |
함수는 main함수 밖에서 정의 되며, main함수의 명령에 호출부를 사용하면, 해당 함수를 실행하도록 되어 있다. 그렇다면, 두 변수의 값을 서로 변경하는 함수를 만들어서 main함수에서 호출하면, 두 변수의 값을 서로 변경시킬 수 있다.
#include<stdio.h>
void swap(int, int);
void main() {
int x = 10, y = 20;//main 지역변수
printf("x=%d,y=%d\n", x, y);
swap(x, y);
printf("x=%d,y=%d", x, y);
}
void swap(int x, int y) {//swap 매개변수
int temp;
temp = x;
x = y;
y = temp;
}
위의 코드는 x값과 y값을 서로 변경할려고 하는 swap함수를 만들어서 사용하는 코드이다. 하지만 결과를 보면 예상과 다르게 변경이 되지 않는 것을 알 수 있다. 왜 그러는 것일까?
함수와 포인터의 관계
코드를 보면, main함수와 swap함수는 같은 변수의 이름을 사용한다. 하지만 이 둘은 서로 다른 함수이다. main함수의 변수x,y는 main함수의 지역변수로 main함수에서만 사용되는 변수이다. 반면 swap함수의 변수x,y는 swap함수에서만 사용되는 매개변수이다. 실제로 이 두 변수의 주소를 출력하면 서로 다른 주소를 사용하는 것을 알 수 있다. 그렇다면 예상한 결과를 출력하기 위해선 어떻게 해야 할까?
main함수의 변수를 swap함수를 통해 수정할려면, 매개변수에 값을 호출하는 것(Call By Value)이 아닌 main함수의 변수x,y의 주소를 호출(Call By Address)하면 된다.
#include<stdio.h>
void swap(int, int);
void main() {
int x = 10, y = 20;//main 지역변수
printf("x=%d,y=%d", x, y);
swap(&x, &y);
printf("x=%d,y=%d", x, y);
}
void swap(int* px, int* py) {//swap 매개변수
int temp;
temp = *px;
*px = *py;
*py = temp;
}
매개변수를 포인터로 만들어서 전달받는 값을 지역변수의 주소값이 되어 버리면, 간접참조연산자를 통해 해당 변수의 주소로 접근하여 변수의 값을 출력하고 변경하게 된다. 그렇게 된다면, 함수를 통해서 그 주소를 가지는 변수의 값이 변경되는 것이고 우리가 예상한 결과를 만들 수 있는 것이다.