포인터와 레퍼런스는 어셈블리 코드 까보면 똑같다. 인자로 들어온 주소를 레지스터에 올리고, 스택에 push하여 그걸 통해 원본에 접근하는 구조이다.
그렇다면 레퍼런스는 왜 쓰는거고 문법도 약간 다른가?
포인터는 nullPtr을 가리킬 때 오류를 발생시킬 수 있고, 그리고 가리키고 있는 주소를 이동시킬 수도 있기 때문에, 실수로 중요한 데이터가 저장된 위치의 주소로 이동해서 값을 변경시켜버릴 수도 있다.
이런걸 방지하기 위해 레퍼런스를 사용한다.
레퍼런스는 유효하지 않은 공간을 가리킬 일이 없고, 원본 하나를 가리켰으면 반드시 그 것만 가리킬 수 있고, 이미 최초에 한 번 어떤 원본을 참조하고나면, 다른 원본을 새로 참조하게 할 수 없다.
그래서 레퍼런스는 원본 그 자체와 동일시된다.
이로 인해 포인터와 달리 문법 양상이, ref = a, &ref = &a로 나타난다.
포인터의 경우에는 ptr = &a, &ptr = &a가 아닌, 포인터 변수의 주소 이렇게 나타날 것이다.
물론 내부적으로 어셈블리단까지 내려가면 처리 내용은 동일하다.