C++에서 포인터를 참조로 전달하는 이유
C++에서 함수에 인자를 전달할 때, 포인터가 가리키는 대상 객체가 아니라 포인터 자체의 값을 변경해야 하는 경우가 있습니다. 이럴 때 포인터를 참조(reference)로 전달하면 됩니다.
일반적으로 포인터를 값으로 전달하면 함수 내부에서는 원본 포인터의 복사본만 조작하게 되므로, 호출자 측의 원본 포인터에는 아무런 영향을 주지 못합니다. 하지만 포인터를 참조(int*&)로 전달하면 함수 내부에서 수행한 모든 변경 사항이 원본 포인터에 그대로 반영됩니다.
예제 코드
아래 예제는 포인터를 참조로 전달하여 함수 안에서 포인터 주소 자체를 감소시키는 방법을 보여줍니다.
#include <iostream>
using namespace std;
void Decrement(int*& d) {
--d; // 포인터 자체의 값을 감소
}
int main(void) {
int a = 26;
int* ptr = &a; // 전달할 포인터
// 감소 전 주소 출력
cout << "Before: " << ptr << endl;
Decrement(ptr);
// 감소 후 주소 출력
cout << "After: " << ptr;
return 0;
}실행 결과
Before: 0x6ffe3c After: 0x6ffe38
코드 설명
Decrement 함수의 매개변수 int*& d는 정수형 포인터에 대한 참조입니다. 따라서 함수 내부에서 --d를 실행하면 포인터가 가리키는 값이 아니라 포인터가 담고 있는 주소 값 자체가 4바이트(int 크기)만큼 감소합니다.
실행 결과를 보면 0x6ffe3c에서 0x6ffe38로 주소가 정확히 4만큼 줄어든 것을 확인할 수 있으며, 이는 원본 포인터 ptr이 함수 호출 후 실제로 변경되었음을 의미합니다.
정리
- 객체 값을 수정하고 싶다면 → 일반적인 포인터 전달(
int*) 사용 - 포인터 자체를 수정하고 싶다면 → 참조에 의한 포인터 전달(
int*&) 사용
이처럼 포인터를 참조로 전달하면 함수가 호출자의 원본 포인터를 직접 조작할 수 있어, 연결 리스트 노드 삽입·삭제처럼 포인터 자체를 갱신해야 하는 상황에서 특히 유용합니다.