삶의 공유
[C++]참조자(Reference) 정의 본문
#출저 : 열혈 C++프로그래밍(책)
변수는 할당된 공간에 붙여진 이름이다. 그리고 그 이름을 통해서 해당 메모리 공간에 접근이 가능하다.
여기서, 할당된 하나의 공간에 둘 이상의 이름을 부여하는 경우를 참조(Reference)한다 라고 말한다.
int num1 = 2010;
이렇게 변수를 선언 하면 메모리 공간 상에서는, 아래 처럼 된다.
여기에서 int &num2 = num1; 를 실행하면 num1이라는 이름이 붙어 있는 메모리 공간에는 num2라는 이름이 하나 더 붙게 된다.
*포인터와 헷갈리면 안된다. 포인터 의미와 구분 짓자면,
int *ptr = &num1 // 변수 num1의 주소 값을 반환해서 포인터 ptr에 저장해라.
int &num2 = num1 // 변수 num1에 대한 참조자 num2를 선언해라.
이렇게 구분이 된다.
변수와 기능,연산의 결과가 동일 하나, '참조자' 라는 별도의 이름으로 정의된다.
만약 num2 = 3047; 이라는 구문이 실행되면, 변수 num1의 메모리 공간에 3047이 저장되어 다음과 같이 된다.
즉, 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름 인 것이다.(변수에 별명을 하나 붙여주는것과 같다)
아래 예시는, num1, num2가 동일한 메모리 공간에 두개의 이름으로 되어 동일한 변수 값과 주소를 갖는것을 볼 수 있다.
#include <iostream>
using namespace std;
int main()
{
int num1 = 1020;
int &num2 = num1;
num2 = 3047;
cout << "변수 : " << num1 << endl; // 3047
cout << "참조 : " << num2 << endl; // 3047
cout << "변수 : " << &num1 << endl; // 0x7ffee64c2734
cout << "참조 : " << &num2 << endl; // 0x7ffee64c2734
}
참조자의 몇가지 특징을 보면,
1) 참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언 할 수 있다.
int num1 = 2759;
int &num2 = num1;
int &num3 = num1;
int &num4 = num1;
이 문장은, 아래와 같이 실행해도 위와 같은 결과를 얻을 수 있다.
int num1 = 2759;
int &num2 = num1;
int &num3 = num2; // 3 -> 2 -> 1
int &num4 = num3; // 4 ->3 -> 2 -> 1
2)참조자는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 변수(배열의 요소 포함, 배열 X)를 참조 해야만 한다.
int &ref = 20; (x)
int &ref; (x)
int &ref = NULL (x)
또한, 포인터 변수도 변수이기 때문에 참조자의 선언이 가능하다.
#include <iostream>
using namespace std;
int main()
{
int num = 12;
int *ptr = # // 포인터 변수 prt에 num의 주소를 대입함.
int **dptr = &ptr; // num에 저장된 값 12 가 dptr에 저장됨.
int &ref = num; //num이라는 메모리 공간에 ref 별칭을 붙임.
int *(&pref) = ptr; // pref는 포인터 변수 ptr의 참조자이므로, 변수 num에 저장된 값이 출력됨.
int **(&dpref) = dptr; // dpref 포인터 변수 dptr의 참조자 이므로, 변수 num에 저장된 값이 출력된다.
cout << ref << endl; //12
cout << *pref << endl; //12
cout << **dpref << endl; //12
}
'Programing > C++' 카테고리의 다른 글
[C++] 코딩테스트 준비(백준, 고양이문제) (0) | 2021.01.14 |
---|---|
[C++] Call by reference & Call by Value (0) | 2020.11.09 |
C++ 자료형 bool (0) | 2020.10.26 |
[C++]namespace(이름 공간) (0) | 2020.10.21 |
[C++]인라인(Inline) 함수 (0) | 2020.10.21 |