Coding/Tip !!
const 참조자
IMyoungho
2018. 9. 17. 18:53
& 연산자는 변수의 주소값을 반환한다
우리가 pointer를 공부할 때 한번쯤은 보게되는 &이다.
&는 참조자선언을 의미한다.
변수의 주소값을 반환하려면 할당된 메모리 공간이 필요하고 그렇기 때문에 이는 상수가 아닌 변수에 사용된다.
<기본 사용법>
1 2 3 4 5 6 7 8 | #include <stdio.h> int main(){ int num = 7; int *pointer = # int &refer = num; return 0; } |
<잘못된 사용법>
int &refer = 7; -> 참조자는 이미 선언된 할당된 메모리를 가진 변수를 대상으로 사용이 가능함, 변수가 아닌 상수를 참조했음으로 잘못됨
int &refer; -> 아무것도 참조하는 대상이 없음
int &refer = NULL; -> NULL을 참조함으로 에러임
하지만 예외의 경우가 있다.
const 참조자는 리터럴 상수를 참조할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int func(const int &num1, const int &num2){ return num1; } int main(){ func(1,2); return 0; } |
이러한 코드가 있다고 할 때, const 참조자를 사용한다면 1, 2의 주소를 참조하는 것이 아니라
1, 2가 저장되는 임시적인 변수의 주소를 참조하게 되는 것이다.
const 참조자가 이러한 리터럴 상수를 참조하지 못하게 되면
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int func(const int &num1, const int &num2){ return num1; } int main(){ int num1=1; int num2=2; func(num1, num2); return 0; } |
이런식으로 상수를 변수에 넣고 그 변수를 이용하여 함수를 사용하여야 한다.
이것보다 편리하게 사용할 수 있게 하기위해 const가 리터럴 상수를 참조할 수 있는 것이다.
의문점
int b= 10;
Int *a=&b;
포인터 a가 b의 주소를 가리킴
--------------------------------
Int d=10;
Int &c=d;
c는 변수d의 메모리공간을 참조함
-> 여기서 *a나 c는 같은의미로 해석해되 되는가??
결론 : 포인터는 물리적으로 사용자가 해당 주소를 정해주지만 래퍼런스 &의 경우는 컴파일러가 알아서 주소를 매핑해줌
그 차이를 제외하고는 같은 의미로 해석해도 좋다고 보여짐
c++은 보통 포인터보다는 래퍼런스를 사용하는 것을 추천한다고 한다. (thanks to umbum^^)
@ const 변수는 생성시 초기화해주지 않으면 에러가 발생함
1 2 3 4 5 6 7 8 | #include <iostream> using namespace std; int main(){ const int a; (x) -> 에러발생 const int a = 1; (0) -> 선언과 동시에 초기화해아함 } |
반응형