전제 조건: 포인터 , 참고자료
C 및 C++는 참조만 지원한다는 점에서 Java, Python, Ruby, Perl 및 PHP와 같은 대부분의 다른 프로그래밍 언어와 다른 포인터를 지원합니다. 그러나 흥미롭게도 C++는 포인터와 함께 참조도 지원합니다.
표면적으로 참조와 포인터는 둘 다 하나의 변수가 다른 변수에 대한 액세스를 제공하는 데 사용되므로 매우 유사합니다. 둘 다 동일한 기능을 많이 제공하므로 이러한 메커니즘의 차이점이 무엇인지 불분명한 경우가 많습니다. 이 기사에서는 포인터와 참조의 차이점을 설명하려고 합니다.
자바 프로그램 루프
포인터 : 포인터는 다른 변수의 메모리 주소를 보유하는 변수입니다. 포인터는 다음을 사용하여 역참조되어야 합니다. * 연산자가 가리키는 메모리 위치에 액세스합니다.
참고자료 : 참조 변수는 별칭, 즉 이미 존재하는 변수의 또 다른 이름입니다. 포인터와 마찬가지로 참조도 객체의 주소를 저장하여 구현됩니다.
참조는 자동 간접 참조를 사용하는 상수 포인터(상수 값에 대한 포인터와 혼동하지 마세요!)로 생각할 수 있습니다. 즉, 컴파일러는 다음을 적용합니다. * 당신을 위한 연산자입니다.
int i = 3; // A pointer to variable i or 'stores the address of i' int *ptr = &i; // A reference (or alias) for i. int &ref = i;>
차이점 :
1. 초기화: 포인터는 다음과 같은 방법으로 초기화될 수 있습니다.
int a = 10; int *p = &a; // OR int *p; p = &a;>
동일한 단계 또는 여러 줄에서 포인터를 선언하고 초기화할 수 있습니다.
2. 참고문헌에 있는 동안,
int a = 10; int &p = a; // It is correct // but int &p; p = a; // It is incorrect as we should declare and initialize references at single step>
메모: 이 차이는 컴파일러마다 다를 수 있습니다. 위의 차이점은 Turbo IDE와 관련이 있습니다.
삼. 재할당: 포인터를 다시 할당할 수 있습니다. 이 속성은 연결된 목록, 트리 등과 같은 데이터 구조를 구현하는 데 유용합니다. 다음 예를 참조하세요.
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. 반면, 참조는 다시 할당할 수 없으며 초기화 시 할당해야 합니다.
int a = 5; int b = 6; int &p = a; int &p = b; // This will throw an error of 'multiple declaration is not allowed' // However it is valid statement, int &q = p;>
5. 메모리 주소: 포인터는 스택에서 자체 메모리 주소와 크기를 갖는 반면 참조는 원래 변수와 동일한 메모리 주소를 공유하며 스택에서 공간을 차지하지 않습니다.
int &p = a; cout << &p << endl << &a;>
6. NULL 값: 포인터에는 NULL을 직접 할당할 수 있지만 참조에는 할당할 수 없습니다. 참조와 관련된 제약 조건(NULL 없음, 재할당 없음)은 기본 작업이 예외 상황에 빠지지 않도록 보장합니다.
str을 int로
7. 우회: 추가 수준의 간접 참조를 제공하는 포인터에 대한 포인터(이중 포인터라고도 함)를 가질 수 있지만 참조는 한 수준의 간접 참조만 제공합니다. 예를 들어,
In Pointers, int a = 10; int *p; int **q; // It is valid. p = &a; q = &p; // Whereas in references, int &p = a; int &&q = p; // It is reference to reference, so it is an error>
8. 산술 연산: 포인터에 대해서는 다양한 산술 연산을 수행할 수 있지만 참조 연산이라는 것은 없습니다(단, &obj + 5와 같이 참조가 가리키는 객체의 주소에 대해 포인터 연산을 수행할 수 있습니다).
C++에서 참조와 포인터 간의 차이점을 표 형식으로 나타냅니다.
| 참고자료 | 포인터 | |
|---|---|---|
| 재할당 | Reference에서는 변수를 재할당할 수 없습니다. | 변수는 포인터에서 재할당될 수 있습니다. |
| 메모리 주소 | 원래 변수와 동일한 주소를 공유합니다. | 포인터는 자신만의 메모리 주소를 가지고 있습니다. |
| 일하다 | 다른 변수를 참조하고 있습니다. | 변수의 주소를 저장하고 있습니다. |
| 널 값 | null 값이 없습니다. | null로 할당된 값을 가질 수 있습니다. |
| 인수 | 이 변수는 값 전달 메서드에 의해 참조됩니다. | 포인터는 참조에 의한 전달이라는 방법으로 작동합니다. |
언제 사용하나요?
성능은 참조가 포인터로 내부적으로 구현되는 것과 정확히 동일합니다. 하지만 언제 무엇을 사용할지 결정하기 위해 몇 가지 사항을 염두에 둘 수 있습니다.
숫자를 문자열로 변환 자바
- 참조 사용:
- 함수 매개변수 및 반환 유형.
- 포인터를 사용하십시오:
- 포인터 연산이나 NULL 포인터 전달이 필요한 경우. 예를 들어 배열의 경우입니다(배열에 액세스하는 것은 포인터 연산을 사용하여 구현됩니다).
- 연결된 목록, 트리 등과 같은 데이터 구조와 해당 알고리즘을 구현합니다. 왜냐하면 다른 셀을 가리키려면 포인터라는 개념을 사용해야 하기 때문입니다.
C++ FAQ Lite에서 인용됨 : 가능하면 참조를 사용하고, 필요할 때는 포인터를 사용하십시오. 재장착이 필요하지 않을 때마다 일반적으로 포인터보다 참조가 선호됩니다. 이는 일반적으로 참조가 클래스의 공개 인터페이스에서 가장 유용하다는 것을 의미합니다. 참조는 일반적으로 개체의 스킨에 나타나고 포인터는 내부에 나타납니다.
위의 경우에 대한 예외는 함수의 매개변수나 반환 값에 센티넬 참조(객체를 참조하지 않는 참조)가 필요한 경우입니다. 일반적으로 포인터를 반환/취하고 nullptr 값에 이 특별한 의미를 부여하는 것이 가장 좋습니다(참조는 역참조된 null 포인터가 아니라 항상 개체의 별칭을 지정해야 함).
관련 기사:
언제 인수를 참조 또는 포인터로 전달합니까?