본문 바로가기

C++/Data Type

Pointer - vs - Reference

포인터 ( Pointer ) 는 개체의 메모리 주소를 저장하는 변수입니다. 즉, 어떠한 데이터가 메모리에 저장될 때, 데이터가 시작되는 주소가 포인터 변수에 담기게 되는 것입니다.

 

참조 ( Reference ) 는 포인터와 마찬가지로 데이터의 주소를 저장하긴 하지만, 포인터와는 달리 초기화되고 나면 다른 개체를 참조하거나 Null 로 설정하는 것이 불가능합니다.


둘의 차이는 매개변수를 전달하는 방식에서도 확인할 수 있습니다. 일반적으로 매개변수를 포인터로 사용하면 Call by Address 라고 하고, 레퍼런스로 사용하면 Call by Reference 라고 합니다.

 

Call by Address 일 경우

void CallByAddress(int* address)
{
    *address = 20;
    std::cout << *address << std::endl;	// address 의 주소의 값 = num 의 주소의 값 (num)
    std::cout << &address << std::endl;	// address 의 주소
    std::cout << address << std::endl;	// address 의 값 = num 의 주소 (&num)
}

int main()
{
    int num = 10;
    CallByAddress(&num);
    
    std::cout << num << std::endl;	// num 의 주소의 값
    std::cout << &num << std::endl;	// num 의 주소
    
    return 0;
}

 

로 되는데, 여기서 포인터 변수 address 에는 num의 주소 ( &num ) 가 저장이 됩니다. 따라서 역참조 (*) 를 통해 address 에 담긴 num 의 주소가 가리키는 값, 즉, num 의 값에 접근을 할 수 있게 됩니다.

  • *address = 20  →  num = 20

하지만 주의해야할 것은 포인터 변수 address 자체는 새로 생성된 변수이므로, num 의 주소와 같지 않습니다.

  • &address ≠ &num

 

Call by Reference 일 경우

void CallByReference(int& reference)
{
    reference = 20;
    std::cout << reference << std::endl;	// reference 의 주소의 값
    std::cout << &reference << std::endl;	// reference 의 주소
}

int main()
{
    int num = 10;
    CallByReference(num);
    
    std::cout << num << std::endl;	// num 의 주소의 값
    std::cout << &num << std::endl;	// num 의 주소
    
    return 0;
}

 

로 되는데, 여기서 선언되는 참조 변수 reference 는 위의 포인터처럼 새로 생성되는 것이 아닌, num 이 할당된 메모리를 공유하게 됩니다. 즉, reference 는 num 의 또다른 이름이라고도 할 수 있으며, reference 의 주소num 의 주소와 동일하게 취급되며 당연히 reference 의 값을 변경하면 num 의 값도 변경되게 됩니다.

  • reference = 20  →  num = 20
  • &reference = &num

자료 출처

'C++ > Data Type' 카테고리의 다른 글

Const  (0) 2024.02.14