Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 포인터를 참조로 전달해야 하는 이유

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*&) 사용

이처럼 포인터를 참조로 전달하면 함수가 호출자의 원본 포인터를 직접 조작할 수 있어, 연결 리스트 노드 삽입·삭제처럼 포인터 자체를 갱신해야 하는 상황에서 특히 유용합니다.