두 개의 숫자 a와 b가 있다고 가정해 봅시다. 이때 (a + b)와 (a - b)를 동시에 계산할 수 있는 함수를 정의해야 합니다. 그런데 C 언어에서는 하나의 함수가 최대 한 개의 값만 반환할 수 있다는 제약이 있습니다.
이러한 제한을 극복하고 여러 개의 결과값을 얻으려면, 포인터를 이용해 함수의 인자로 출력 매개변수(output parameter)를 전달하는 방법을 사용할 수 있습니다. 이 문제에서는 a를 a+b 값으로, b를 a-b 값으로 갱신하는 것이 목표입니다. 따라서 함수를 호출할 때 두 변수의 주소값을 함께 넘겨주어야 합니다.
예를 들어 입력이 a = 5, b = 8이라면, 실행 결과는 다음과 같습니다.
a + b = 13
a - b = -3
문제 해결 접근 방법
이 문제는 다음 단계를 통해 해결할 수 있습니다.
solve()라는 함수를 정의합니다. 이 함수는 a와 b의 주소값을 매개변수로 받습니다.
temp 변수에 전달받은 주소의 두 값의 합(a + b)을 저장합니다.
b에는 두 값의 차(a - b)를 대입합니다.
마지막으로 a에 temp 값을 대입합니다.
예제 코드
아래 구현 예시를 통해 더 자세히 이해해 보겠습니다.
#include <stdio.h>
int solve(int *a, int *b){
int temp = *a + *b; // 두 값의 합을 temp에 저장
*b = *a - *b; // b에 두 값의 차를 저장
*a = temp; // a에 합을 저장
}
int main(){
int a = 5, b = 8;
solve(&a, &b); // 변수의 주소값을 전달
printf("a + b = %d and a - b = %d", a, b);
}입력
a = 5, b = 8
출력
a + b = 13 and a - b = -3
코드 설명
solve() 함수는 포인터를 통해 원본 변수에 직접 접근합니다. *a와 *b는 각각 a와 b가 저장된 메모리 주소가 가리키는 실제 값을 의미하며, 역참조(dereference)를 통해 해당 값을 읽거나 수정할 수 있습니다.
main() 함수에서 solve(&a, &b)처럼 주소 연산자(&)를 사용해 변수의 주소를 전달하기 때문에, 함수 내부에서 수행한 변경 사항이 호출한 쪽의 변수에 그대로 반영됩니다. 이것이 바로 포인터를 활용한 출력 매개변수 기법의 핵심입니다.