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 = &num;
    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-> 선언과 동시에 초기화해아함 
}




반응형