변수란 할당된 메모리 공간에 붙여진 이름이다. 그리고 이름을 통해서 해당 메모리 공간에 접근이 가능하다.
여기서 참조자라는 것은 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것이다.
예시를 통해 알아보자.
#include <iostream>
using namespace std;
int main(void)
{
int num1 = 1020;
int& num2 = num1;
num2 = 3047;
cout << "VAL : " << num1 << endl;
cout << "REF : " << num2 << endl;
cout << "VAL : " << &num1 << endl;
cout << "REF : " << &num2 << endl;
return 0;
}

num1의 참조자로 num2를 선언한 상태에서 num2의 값을 3047로 새로 설정하게 되었다. num2와 num1은 동일한 메모리 공간을 참조하기 때문에 num1과 num2의 값은 3047로 변경된 것이다.
동일한 메모리 공간을 참조하기 때문에 num1과 num2의 주소값이 같은 것을 확인할 수 있다.
참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언할 수 있다.
다음과 같이 여러 개의 참조자를 선언하는 것이 가능하다.
int num1=2759;
int &num2=num1;
int &num3=num1;
int &num4=num1;
하지만 필요 이상으로 참조자를 선언하는 것은 좋은 방법은 아니다. 참조자를 대상으로 참조를 만드는 일은 흔히 필요하지 않다.
참조자의 선언 가능 범위
참조자는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 누군가를 참조해야만 된다.
다음의 선언은 유효하지 않는다.
int &ref=20;
int &ref;
int &ref=NULL;
상수를 대상으로 참조자를 선언할 수 없으며, 미리 참조자를 선언했다가 후에 참조를 하는 것은 불가능하다. 참조의 대상을 바꾸는 것도 불가능하다.
참조자를 선언하면서 NULL로 초기화하는 것도 불가능하다.
참조자는 무조건 선언과 동시에 변수를 참조하도록 해야 한다. 여기서 변수의 범위는 배열요소도 포함된다.
다음 예시를 보자.
#include <iostream>
using namespace std;
int main(void)
{
int arr[3] = { 1, 3, 5 };
int &ref1 = arr[0];
int &ref2 = arr[1];
int& ref3 = arr[2];
cout << ref1 << endl;
cout << ref2 << endl;
cout << ref3 << endl;
return 0;
}

arr의 배열 안의 값을 받아와 각각 1, 3, 5의 값을 출력하는 것을 볼 수 있다. 배열요소는 변수로 간주되어 참조자의 선언이 가능하다.
다음 예시는 포인터 변수도 참조자 선언이 가능한 예시이다.
#include <iostream>
using namespace std;
int main(void)
{
int num = 12;
int* ptr = #
int** dptr = &ptr;
int& ref = num;
int* (&pref) = ptr;
int** (&dpref) = dptr;
cout << ref << endl;
cout << *pref << endl;
cout << **dpref << endl;
return 0;
}

'코딩 > C++' 카테고리의 다른 글
| Class (1) | 2024.12.26 |
|---|---|
| 동적 배열 할당 (1) | 2024.12.23 |
| 05. 자료형 bool (1) | 2022.07.12 |
| 04. 이름공간(namespace) (1) | 2022.07.08 |
| 03. 인라인 함수 (2) | 2022.06.30 |