변수는 할당된 메모리 공간에 붙여진 이름이다. 우리는 변수의 이름을 가지고 해당 메모리 공간에 접근이 가능하다. 참조자는 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 말한다. 자신이 참조하는 변수를 대신할 수 있는 별명과 같은 것이다.
std::string str = "HI THIS IS BRAIN";
std::string *stringPTR = &str;
std::string &stringREF = str;
std::cout << "str = " << str << std::endl;
std::cout << "stringPTR = " << *stringPTR << std::endl;
std::cout << "stringREF = " << stringREF << std::endl;
stringREF = "HI THIS IS NOT BRAIN";
std::cout << "====================value change====================" << std::endl;
std::cout << "str = " << str << std::endl;
std::cout << "stringPTR = " << *stringPTR << std::endl;
std::cout << "stringREF = " << stringREF << std::endl;
stringREF은 str의 별명이며 같은 메모리 공간을 참조한다. 참조자를 통해 값을 변경하면 메모리 공간을 같이 쓰는 변수의 값도 변경된다.
참조자와 포인터는 유사한 점이 많은데, 참조자는 포인터를 잘못 사용해서 생길 수 있는 문제를 줄이기 위한 대안이며, 포인터보다 제약사항이 많다고 한다.
int main()
{
std::string str = "HI THIS IS BRAIN";
std::string *stringPTR = &str;
std::string &stringREF = str;
std::cout << "=============================" << std::endl;
std::cout << " STRING " << std::endl;
std::cout << "=============================" << std::endl;
std::cout << "str = " << str << std::endl;
std::cout << "stringPTR = " << *stringPTR << std::endl;
std::cout << "stringREF = " << stringREF << std::endl;
std::cout << "=============================" << std::endl;
std::cout << " ADDRESS " << std::endl;
std::cout << "=============================" << std::endl;
std::cout << "str = " << &str << std::endl;
std::cout << "stringPTR = " << stringPTR << std::endl;
std::cout << "stringREF = " << &stringREF << std::endl;
}