ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [아는대로써보기] 포인터 - 4
    카테고리 없음 2021. 4. 13. 14:58

    Keywords : 참조자, call-by-reference, call-by-value

     

    &와 *의 사용에 혼동이 있었음

     

    아래와 같이 메소드 "foo" 를 정의하는 경우, 

    A_arg 앞에 & 때문에 주소값을 파라미터로 받는다고 생각할 수 있지만,

    #include <iostream>
    
    void foo(const int& A_arg) { std::cout << "A_arg is " << A_arg << std::endl; }
    
    int main(int argc, char* argv[]) {
      int A = 5;
      foo(A);
      return 0;
    }

    이는 참조자로써, 

    main함수에서 "foo"함수를 호출할때, 변수 자체를 인자로 넣어주면,

    해당 변수의 메모리 공간을 A_arg의 이름으로 참조한다는 뜻임.

     

    A_arg는 포인터변수가 아니므로, A_arg를 이용해 직접적인 변형이 가능하며,

    이 변형은 참조했던 메소드 밖의 변수에도 적용됨.

     

    하지만 위의 코드에서는 "const int& A_arg"로 정의했으므로 값의 변경은 불가하나, 

    직접적으로 변수를 인자로 받는 경우보다, 복사 과정을 건너뛸 수 있어서, 빠르다!

     

    따라서 아래와 같이 코드를 작성하게되면,

    foo라는 함수가 호출되면서, 참조자를 통해 변수 A를 업데이트 했으므로,

    출력은 아래와 같다.

    #include <iostream>
    
    void foo(int& A_arg) {
      std::cout << "A_arg is " << A_arg << std::endl;
      A_arg += 2;
      std::cout << "\nA_arg is updated" << std::endl;
      std::cout << "A_arg is " << A_arg << std::endl;
    }
    
    int main(int argc, char* argv[]) {
      int A = 5;
      foo(A);
      std::cout << "\nfunction foo is done" << std::endl;
      std::cout << "A is " << A << std::endl;
      return 0;
    }
    더보기

    A_arg is 5

    A_arg is updated
    A_arg is 7

    function foo is done
    A is 7

Designed by Tistory.