프로그래밍 언어/C++
함수와 포인터, 인수 전달 방식
claire
2022. 1. 8. 13:31
함수가 외부로부터 매개 변수를 통하여 데이터를 받는 방법은 크게 두가지 이다.
Call by value : 값에 의한 호출 //인수의 복사본을 함수로 전달 - 원본 변화 없음
Call by reference : 참조에 의한 호출 //인수의 원본을 '직접' 함수로 전달
#include <stdio.h>
void swapNum(int first, int second) // 반환값 없음, int형 매개변수 두 개 지정
{
int temp; // 임시 보관 변수
temp = first;
first = second;
second = temp;
}
int main()
{
int num1 = 10;
int num2 = 20;
swapNum(num1, num2); // 변수 num1과 num2를 넣어줌
printf("%d %d\n", num1, num2); // 10 20: swapNum 함수와는 상관없이
// 처음 저장한 10과 20이 출력됨
return 0;
}
위 코드의 출력 결과는 10 20 . swapNum 함수로 인해 main함수 내의 변수의 값이 바뀌지않았다. 즉, 매개변수는 값을 전달하는 역할만 할 뿐 함수 바깥의 변수와는 상관이 없다.
다음은 매개변수를 포인터로 사용해보겠다.
#include <stdio.h>
void swapNum(int *first, int *second) // 반환값 없음, int 포인터 매개변수 두 개 지정
{
int temp; // 임시 보관 변수
// 역참조로 값을 가져오고, 값을 저장함
temp = *first;
*first = *second;
*second = temp;
}
int main()
{
int num1 = 10;
int num2 = 20;
swapNum(&num1, &num2); // &를 사용하여 num1과 num2의 메모리 주소를 넣어줌
printf("%d %d\n", num1, num2); // 20 10: swapNum에 의해서 num1과 num2의 값이 서로 바뀜
return 0;
}
위 코드의 출력은 20 10 이다. 변수의 메모리 주소를 함수에 전달하면 함수 안에서는 메모리 주소에 접근하여 값을 저장할 수 있다.
함수의 반환값은 값을 하나만 반환할 수 있는데 이처럼 매개변수를 포인터로 사용하면 함수 바깥으로 여러 개의 값을 전달할 수 있다.
지금까지 scanf 함수를 사용할 때 변수를 그대로 넣지 않고 &를 사용하여 변수의 메모리 주소를 넣었다. 왜냐하면 scanf 함수는 값을 여러개 입력받을 수 있는데 반환값만으로는 여러 개의 값을 함수 바깥으로 가져올 수 없었기 때문이다.
int num1;
int num2;
int num3;
scanf("%d %d %d", &num1, &num2, &num3); // scanf에서 값을 3개 가져옴(scanf는 바깥으로 값을 3개 전달)
변수의 메모리 주소만 넘겨주면 값이 몇 개든 상관없이 값을 가져올 수 있다.