C언어 에서는 어떠한 변수를 가리키고 싶을 땐 반드시 포인터를 사용해야 했다. C++에서는 다른 변수나 상수를 가리키는 또 다른 방법으로 **참조자(레퍼런스)**를 제공한다. 참조자를 지정하는 방법은 가리키고자 하는 타입 뒤에 **&**를 붙이면 된다.

#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의 또 다른 이름이라고 컴파일러에게 알려주는 것이다. another_a에 어떠한 작업을 수행하든 이는 a에 작업을 하는 것과 마찬가지이다.

참조자의 특징

  1. 레퍼런스는 정의 시에 누구의 별명인지 명시해야 한다.
  2. 한 번 어떤 변수의 참조자가 된다면, 더이상 다른 변수를 참조할수 없다.
  3. 레퍼런스는 메모리 상에 존재하지 않을 수도 있다.
  4. 참조자를 함수의 매개변수로 이용할 수 있다. (포인터를 이용한 call by reference와 유사한 동작)
  5. 포인터와는 다르게 사용시 &와 같은 연산자를 사용할 필요가 없다.
  6. 레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없다. (일반적으로 레퍼런스는 메모리를 갖지 않기 때문에)
  7. 상수 리터럴을 참조시에는 상수 참조자로 선언한다.
  8. 댕글링 레퍼런스(Dangling reference): 참조 하던 것이 사라진 레퍼런스
// 상수 리터럴 참조 예시
const int &ref = 4;

// 배열 참조 예시
int arr[3] = {1, 2, 3};
int(&ref)[3] = arr;

int arr[3][2] = {1, 2, 3, 4, 5, 6};
int (&ref)[3][2] = arr;

추가정리