#include <iostream>
int main() {
int a = 3;
int& another_a = a;
another_a = 5;
std::cout << "a : " << a << std::endl;
std::cout << "another_a : " << another_a << std::endl;
return 0;
}

&를 붙이는 것another_a가 a의 또 다른 이름이라고 컴파일러에게 알려주는 것을 의미int& another_a; // 불가능
int& another_a = a; // 가능
int a = 10;
int &another_a = a; // another_a 는 이제 a 의 참조자!
int b = 3;
another_a = b; // b의 별명이 another_a라는게 아니라, a에 b의 값을 대입하라는 의미
int a = 10;
int &another_a = a; // another_a 가 쓰이는 자리는 모두 a로 바꿔치기하면 되므로 메모리 상에 공간을 할당할 필요가 없음
레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없음
int a, b;
int& arr[2] = {a, b}; // error
문법 상 배열의 이름(arr)은 첫 번째 원소의 주소값으로 변환될 수 있어야 함.
따라서 arr[1]과 같은 문장이 *(arr+1)로 바뀌어 처리될 수 있음. 즉, 주소값이 존재한다라는 의미는 해당 원소가 메모리 상에서 존재한다는 것을 의미함. 하지만 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에서 공간을 차지하지 않기 때문에 cpp 언어 차원에서 금지되어 있음.
_
그러나 반대로, 배열들의 레퍼런스는 가능
#include <iostream>
int main() {
int arr[3] = {1, 2, 3};
int(&ref)[3] = arr;
ref[0] = 2;
ref[1] = 3;
ref[2] = 1;
std::cout << arr[0] << arr[1] << arr[2] << std::endl;
// 출력 결과 231
return 0;
}
위의 예제에서는 ref가 arr를 참조.
따라서 ref[0] ~ ref[2]는 각각 arr[0] ~ arr[2]의 레퍼런스가 되는 것!