프로그래밍 언어/C++

C ++에서 포인터 변수와 참조 변수의 차이점

Rateye 2021. 7. 20. 10:32
728x90
반응형

 

질문 : C ++에서 포인터 변수와 참조 변수의 차이점은 무엇입니까?

참조가 구문 적 설탕이라는 것을 알고 있으므로 코드를 읽고 쓰기가 더 쉽습니다.

그러나 포인터 변수와 참조 변수의 차이점은 무엇입니까?

답변

  1. 포인터를 다시 할당 할 수 있습니다.
    int x = 5;
    int y = 6;
    int *p;
    p = &x;
    p = &y;
    *p = 10;
    assert(x == 5);
    assert(y == 10);
    참조는 다시 바인딩 될 수 없으며 초기화시 바인딩되어야합니다.
    int x = 5;
    int y = 6;
    int &q; // error
    int &r = x;
  2. 포인터 변수는 고유 한 ID를 가지고 있습니다. 단항 & sizeof 연산자로 측정 할 수있는 특정 공간입니다. 참조에서 이러한 연산자를 사용하면 참조가 바인딩 된 값에 해당하는 값이 반환됩니다. 참조의 자체 주소와 크기는 보이지 않습니다. 참조는 이러한 방식으로 원래 변수의 신원을 가정하므로 참조를 동일한 변수에 대한 다른 이름으로 생각하는 것이 편리합니다.
    int x = 0;
    int &r = x;
    int *p = &x;
    int *p2 = &r;
    
    assert(p == p2); // &x == &r
    assert(&p != &p2);
  3. 추가 수준의 간접 지정을 제공하는 포인터에 대한 포인터를 임의로 중첩 할 수 있습니다. 참조는 한 가지 수준의 간접적만을 제공합니다.
    int x = 0;
    int y = 0;
    int *p = &x;
    int *q = &y;
    int **pp = &p;
    
    **pp = 2;
    pp = &q; // *pp is now q
    **pp = 4;
    
    assert(y == 4);
    assert(x == 2);
  4. nullptr 할당 할 수 있지만 참조는 기존 객체에 바인딩해야합니다. 충분히 노력하면 참조를 nullptr 바인딩 할 수 있지만 이것은 정의되지 않았 으며 일관되게 작동하지 않습니다.
    /* the code below is undefined; your compiler may optimise it
     * differently, emit warnings, or outright refuse to compile it */
    
    int &r = *static_cast<int *>(nullptr);
    
    // prints "null" under GCC 10
    std::cout
        << (&r != nullptr
            ? "not null" : "null")
        << std::endl;
    
    bool f(int &r) { return &r != nullptr; }
    
    // prints "not null" under GCC 10
    std::cout
        << (f(*static_cast<int *>(nullptr))
            ? "not null" : "null")
        << std::endl;
    nullptr 인 포인터에 대한 참조를 가질 수 있습니다.
  5. 포인터는 배열을 반복 할 수 있습니다. ++ 를 사용하여 포인터가 가리키는 다음 항목 + 4 를 사용하여 5 번째 요소로 이동할 수 있습니다. 이것은 포인터가 가리키는 개체의 크기와 관계가 없습니다.
  6. 포인터는 가리키는 * 로 역 참조되어야하는 반면 참조는 직접 사용될 수 있습니다. 클래스 / 구조체에 대한 포인터는 -> 를 사용하여 멤버에 액세스하는 반면 참조는 . .
  7. 참조는 배열에 넣을 수 없지만 포인터는 (@litb 사용자가 언급)
  8. Const 참조는 임시에 바인딩 될 수 있습니다. 포인터는 다음을 수행 할 수 없습니다 (일부 간접 지정 없이는 안 됨).
    const int &x = int(12); // legal C++
    int *y = &int(12); // illegal to take the address of a temporary.
    const & 인수 목록 등에서 사용하기 더 편리하게 만듭니다.

 

 

출처 : https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in
728x90
반응형