ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • const 참조자
    Coding/Tip !! 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-> 선언과 동시에 초기화해아함 
    }




    반응형

    'Coding > Tip !!' 카테고리의 다른 글

    ::연산자와 . 연산자  (0) 2018.09.19
    static 변수  (0) 2018.09.18
    댕글링 포인터 ( Dangling Pointer)  (0) 2018.09.17
    strcmp와 strncmp  (0) 2018.08.20
    C++ 클래스에서 다른클래스를 함수의 인자로 사용할 때  (0) 2018.04.14

    댓글

Designed by Tistory.