<CPP>/BASIC

22. 참조(&)와 포인터(*) 차이

CodeGrimie 2021. 1. 25. 12:59

참조(&)는 CPP에서 추가된 새로운 기능이다.

 

이전에 13. 포인터(Pointer) 에서 등장했었기 때문에 이번에는 둘의 차이점만 간단하게 정리한다.

 

▼ 참조(&)는 선언과 동시에 초기화가 되어야 한다.

int main()
{
    int base = 5;

    int *pointer;
    pointer = &base; // OK

    int &reference;
    reference = &base; // ERROR

    return (0);
}

코드에서 보는 것처럼 참조(&)를 포인터(*)처럼 선언 후 따로 초기화하려고 하면 에러가 발생한다.

int *reference = base; 와 같이 선언과 동시초기화를 진행해줘야 한다.

불편해 보일 수도 있지만 이러한 규칙 때문에 참조(&)는 무조건 초기화가 되기 때문에 매번 nullptr을 확인해주지 않아도 되는 장점도 있다.

 

▼ 참조(&)는 메모리를 추가로 생성하지 않는다.

void SwapWithAddress(int *lhs, int *rhs)
{
    // int *lhs = &INPUT, 
    // int *rhs = &INPUT;
    int _temp = 0;

    _temp = *lhs;
    *lhs = *rhs;
    *rhs = _temp;
}

void SwapWithReference(int &lhs, int &rhs)
{
    int _temp = 0;

    _temp = lhs;
    lhs = rhs;
    rhs = _temp;
}

포인터(*)를 다룬 13. 포인터(Pointer) 에서도 정리를 했지만 Call By Address는 내부적으로 변수가 생성된다.

그래서 SwapWithAddress가 인자의 개수만큼 메모리가 8Byte(4 + 4) 생성되었다가 해제되는 반면

SwapWithReference는 인자의 그 자신을 가져오는 것이기 때문에 별도의 메모리가 생성되지 않는다.