<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는 인자의 그 자신을 가져오는 것이기 때문에 별도의 메모리가 생성되지 않는다.