2021. 11. 24. 17:51ㆍc++/기초
참조자를 알려면 포인터의 개념도 알아야 한다.
포인터는 그냥 누굴 가르키려고 존재하는 놈이다.
#include <iostream>
using namespace std;
void change(int* a) {
*a = 5;
}
int main()
{
int b = 10;
change(&b);
cout << b;
return 0;
}
자 argument가 포인터로 존재한다.
포인터는 항상 주소값을 받아야 한다. 왜냐하면 포인터는 항상 누구를 가르켜야하기 때문이다.. ㅇㅈ?
그렇기 때문에 포인터는 주소값을 받아야한다. 어떤 변수의 주소값은 변수 앞에 &를 붙이면 된다.
&b <--- b의 주소
그래서 pointer 변수 a의 &b 주소값을 넣어주는 것이다.
그럼 변수 a는 b를 가르킨다. 그럼 a에는 주솟값이 저장 되어 있을 것이다.
실제 a값을 접근하려면 변수 앞에 *를 붙여주면 된다.
그래서 *b = 5를 저장하니까 바깥에 위치한 함수에서도 b의 값을 변경할 수 있게 된다.

c++에는 위 포인터말고도 &(참조자)의 방식을 사용할 수 있다.
#include <iostream>
using namespace std;
void change(int& a) {
a = 5;
}
int main()
{
int b = 10;
change(b);
cout << b;
return 0;
}
참조자를 활용해서 위와 같은 기능을 구현하였다.
참조자는 사용자가 주솟값으로 바꿔 저장하지 않아도 (즉 그냥 변수만 던져줘도) a에 바로 접근할 수 있다.
값을 바꿔도 포인터처럼 뭐 해줄 필요가 없다. 사실상 그냥 동일한 변수가 되는 느낌인듯.
포인터와 참조자의 차이점
1. 포인터는 가리키고 있는 값을 바꿀 수 있지만 참조자는 바꿀수 없다.
2. 포인터는 메모리 상에 항상 존재. 참조자는 메모리에 존재하지 않을 때도 있음. (참조자는 저장된 변수에 동시에 존재)
3. 포인터를 가르키는 포인터의 포인터(이중 포인터)는 존재할 수 있으나, 참조자의 참조자는 있을 수 없다(필요가 없음).
추가적으로 참조자의 배열, 참조자의 포인터는 존재할 수 없습니다.
4. 포인터는 초기화할 때 값을 저장하지 않아도 되지만, 참조자는 초기화할 때 꼭 값을 저장해주어야 한다.
3번이 왜 안되냐면 참조자는 메모리에 존재하지 않을 때도 있기 때문이다.
배열과, 포인터는 항상 어떤 메모리에 저장되는 형태로 존재하는데 참조자는 메모리에 존재하지 않을 때가 있기 때문에 불가한 것.
반대로 배열의 참조자는 가능하다. (배열의 reference는 가능하다!)
int main()
{
int arr[3] = { 1,2,3 };
int (&arr_refer)[3] = arr;
arr_refer[0] = 2;
arr_refer[1] = 3;
arr_refer[2] = 4;
cout << arr[0] << arr[1] << arr[2] << endl;
return 0;
}

배열을 참조할 때는 위의 코드를 참조하자. (ㅋㅋ)
이제 참조 대신 레퍼런스라는 단어를 쓰겠다. (영어 단어에 익숙해져야 함)
우리가 포인터나 레퍼런스를 사용하는 이유는 바로 해당 값에 접근해서 변경할 수 있기 때문이다.
이는 빠른 동작을 요구하는 시스템에서 굉장히 효과적이다.
레퍼런스를 return해주는 함수
int& create_ref(int& a) {
a = 10;
return a;
}
int main()
{
int b = 5;
int& c = create_ref(b);
cout << b << endl;
return 0;
이렇게 레퍼런스를 return을 해주면 좋은 점이 어떤 큰 구조체가 있다고 가정할 때 그냥 변수를 return하면 전체 복사가 발생해서 시간이 오래 걸리지만, 해당 구조체를 가리키는 포인터를 리턴한다면, 포인터 주소 한 번 복사로 끝남.
레퍼런스도 마찬가지.
레퍼런스 변수에다 사라질 변수를 저장한다면?!

위처럼 오류가 생긴다.
하지만

레퍼런스 변수 앞에 const를 붙여주게 된다면 return 되는 a 변수의 생명은 사라지지 않는다!
일단 알아두면 나중에 쓰임새도 있을 것이다.
'c++ > 기초' 카테고리의 다른 글
| 8. 클래스(Class)에 대해서 궁금해! (0) | 2021.11.24 |
|---|---|
| 7. new 와 delete(동적 배열)이 궁금해. (0) | 2021.11.24 |
| 5. 전처리기, 매크로(#define)가 궁금해 (0) | 2021.11.24 |
| 4. 네임스페이스(name space)가 궁금해 (0) | 2021.11.24 |
| 2. Visual Studio 단축키가 궁금해. 디버깅이 궁금해. (0) | 2021.11.24 |