728x90
반응형
질문 : C ++에서 포인터 변수와 참조 변수의 차이점은 무엇입니까?
참조가 구문 적 설탕이라는 것을 알고 있으므로 코드를 읽고 쓰기가 더 쉽습니다.
그러나 포인터 변수와 참조 변수의 차이점은 무엇입니까?
답변
- 포인터를 다시 할당 할 수 있습니다.
참조는 다시 바인딩 될 수 없으며 초기화시 바인딩되어야합니다.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;
- 포인터 변수는 고유 한 ID를 가지고 있습니다. 단항
&
sizeof
연산자로 측정 할 수있는 특정 공간입니다. 참조에서 이러한 연산자를 사용하면 참조가 바인딩 된 값에 해당하는 값이 반환됩니다. 참조의 자체 주소와 크기는 보이지 않습니다. 참조는 이러한 방식으로 원래 변수의 신원을 가정하므로 참조를 동일한 변수에 대한 다른 이름으로 생각하는 것이 편리합니다.int x = 0; int &r = x; int *p = &x; int *p2 = &r; assert(p == p2); // &x == &r assert(&p != &p2);
- 추가 수준의 간접 지정을 제공하는 포인터에 대한 포인터를 임의로 중첩 할 수 있습니다. 참조는 한 가지 수준의 간접적만을 제공합니다.
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);
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
인 포인터에 대한 참조를 가질 수 있습니다.- 포인터는 배열을 반복 할 수 있습니다.
++
를 사용하여 포인터가 가리키는 다음 항목+ 4
를 사용하여 5 번째 요소로 이동할 수 있습니다. 이것은 포인터가 가리키는 개체의 크기와 관계가 없습니다. - 포인터는 가리키는
*
로 역 참조되어야하는 반면 참조는 직접 사용될 수 있습니다. 클래스 / 구조체에 대한 포인터는->
를 사용하여 멤버에 액세스하는 반면 참조는.
. - 참조는 배열에 넣을 수 없지만 포인터는 (@litb 사용자가 언급)
- 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
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C 및 C ++에서 char를 int로 변환 (0) | 2021.07.23 |
---|---|
C ++에서 PI 상수를 사용하는 방법 (0) | 2021.07.22 |
문자열 구분 기호 (표준 C ++)를 사용하여 C ++에서 문자열 구문 분석 (0) | 2021.07.19 |
"STL"과 "C ++ 표준 라이브러리"의 차이점 (0) | 2021.07.16 |
C ++에서 int를 문자열로 변환하는 가장 쉬운 방법 (0) | 2021.07.15 |