728x90
*윤성우의 열혈 C++ 프로그래밍 교재로 학습하며 정리하였습니다.
C++에서는 참조자를 이용하여 메모리 공간에 두개 이상의 이름을 붙여 줄 수 있다.
주소값 반환하는 &과는 사용되는 위치가 다르다..
int num1 = 2010;
변수의 선언으로 인해서 num1이라는 이름으로 메모리 공간이 할당된다.
int &num2 = num1;
참조자의 선언으로 인해서 num1의 메모리 공간에 num2라는 이름이 추가로 붙게 된다.
참조자는 기조에 선언된 변수에 붙이는 '별칭'이다. 그리고 이렇게 참조자가 만들어지면
이는 변수의 이름과 사실상 차이가 없다.
예제
#include <iostream>
using namespace std;
int main()
{
int num1 = 1020;
int& num2 = num1;
//num2는 num1의 참조자이다.
num2 = 3047;
cout << "VAL : " << num1 << endl;
cout << "REF : " << num2 << endl;
cout << "VAL : " << &num1 << endl;
cout << "REF : " << &num2 << endl;
return 0;
}
num2는 num1의 참조자이다.
따라서 이후부터는 num1으로 하는 모든 연산은 num2로 하는 것과 동일한 결과를 보인다.
int num1 = 2759;
int &num2 = num1;
int &num3 = num2;
int &num4 = num3;
위와 같이 참조자의 수에는 제한이 없으며,
참조자를 대상으로 참조자를 선언하는 것도 가능하다.
불가능한 참조자 선언의 예시
int &ref = 20; //X
//상수 대상으로의 참조자 선언은 불가능하다.
int &ref; //X
//참조자는 생성과 동시에 누군가를 참조해야 한다.
int &ref = NULL; //X
//포인터처럼 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;
}
변수의 성향을 지니는 대상이라면 참조자의 선언이 가능하다.
배열의 요소 역시 변수의 성향을 지니기 때문에 참조자의 선언이 가능하다.
포인터 변수 대상의 참조자 선언
#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;
}
ptr과 dptr 역시 변수이다. 다만 주소 값을 저장하는 포인터 변수일 뿐이다.
따라서 포인터 및 더블 포인터 역시 참조자의 선언이 가능하다.
728x90
'공부 > C++' 카테고리의 다른 글
[C++] 2-5. new & delete (1) | 2024.09.15 |
---|---|
[C++] 2-4. 참조자(Reference)와 함수 (2) | 2024.09.14 |
[C++] 2-2. 새로운 자료형 bool (0) | 2024.09.11 |
[C++] 2-1. C언어 복습 (0) | 2024.09.11 |
[C++] 1-5. 이름 공간 (0) | 2024.09.09 |