포인터와 참조는 완전히 다르게 보입니다 (포인터는 연산자' *' 와'->; , 참조는 연산자 \ "\" 을 (를) 사용합니다. ) 하지만 그 기능은 같은 것 같습니다. 포인터와 참조를 사용하면 다른 객체를 간접적으로 참조할 수 있습니다. 포인터를 사용할 시기와 참조를 사용할 시기를 어떻게 결정합니까?
첫째, 어떤 상황에서도 빈 값에 대한 참조를 사용할 수 없다는 것을 깨달아야 한다. 참조는 항상 객체를 가리켜야 합니다. 따라서 변수를 사용하고 객체를 가리키지만 이 변수가 특정 시점에서 객체를 가리키지 않을 수 있는 경우 이 변수를 포인터로 선언해야 합니다. 그러면 이 변수에 null 값을 지정할 수 있기 때문입니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), Northern Exposure (미국 TV 드라마), 변수명언 반대로 변수가 객체를 명시적으로 가리키는 경우 (예: 설계에서 변수를 비워 둘 수 없는 경우) 변수를 참조로 선언할 수 있습니다.
하지만 잠시만 기다려 주세요. "라고 의심스럽게 물었다. "이런 코드는 어떻게 될까요?"
Char * PC = 0;; //포인터를 null 로 설정합니다.
Char & amprc = * pc// 참조가 null 값을 가리키게 합니다
이것은 매우 해롭습니다. 의심의 여지가 없습니다. 결과는 불확실합니다 (컴파일러에서 출력을 생성할 수 있으므로 모든 일이 발생할 수 있음). 오류를 수정하는 데 동의하지 않는 한 이러한 코드를 작성하는 사람은 피해야 합니다. 이런 코드가 당신의 소프트웨어에 나타날까 봐 걱정된다면, 인용 사용을 완전히 피하거나, 더 나은 프로그래머가 하도록 하는 것이 좋겠다. (존 F. 케네디, 공부명언) 앞으로 null 값을 가리킬 가능성을 무시할 것입니다.
참조가 확실히 객체를 가리키기 때문에 C 에서는 참조를 초기화해야 합니다.
현과 현. Rs; //오류, 참조를 초기화해야 합니다.
문자열 s ("xyzzy");
현과 현. RS = s;; //맞습니다. RS 는 s 를 가리킵니다.
포인터에는 이러한 제한이 없습니다.
String * ps// 초기화되지 않은 포인터
//합법적이지만 위험하다
Null 값에 대한 참조가 없다는 사실은 참조 코드를 사용하는 것이 포인터를 사용하는 코드보다 더 효과적이라는 것을 의미합니다. 참조를 사용하기 전에 유효성을 테스트할 필요가 없기 때문입니다.
Void printDouble (상수 double & amp r&d)
{
Cout & lt& ltrd;; //테스트 rd 필요 없음
}//는 배정도 값을 가리켜야 합니다.
대신 포인터가 비어 있지 않도록 항상 포인터를 테스트해야 합니다.
Void printDouble (상수 double *pd)
{
If (pd) {// null 인지 확인합니다.
Cout & lt& lt* PD
}
}
포인터와 참조의 또 다른 중요한 차이점은 다른 객체를 가리키도록 포인터를 재할당할 수 있다는 것입니다. 그러나 참조는 항상 초기화 시 지정한 객체를 가리키며 나중에 변경할 수 없습니다.
문자열 s1("Nancy");
문자열 S2 ("Clancy");
현과 현. Rs = s1; // RS 는 s 1 을 참조합니다.
String * PS = & amps1; // PS 는 s 1 을 가리킵니다.
Rs = s2// RS 또는 s 1 을 의미합니다.
//하지만 현재 s 1 의 값은 다음과 같습니다
//"클랜시"
Ps = & ampS2;; // PS 는 이제 S2 를 가리킵니다.
// s 1 변경되지 않았습니다.
일반적으로 다음과 같은 경우에 포인터를 사용해야 합니다. 첫째, 어떤 대상도 가리키지 않을 가능성을 고려해야 합니다 (이 경우 포인터를 공백으로 설정할 수 있음). 둘째, 서로 다른 시간에 서로 다른 대상을 가리킬 수 있어야 합니다. (이 경우 포인터의 방향을 바꿀 수 있습니다.) 항상 대상을 가리킨다면, 일단 대상을 가리키면, 그 점을 바꾸지 않을 것이므로, 인용문을 사용해야 한다. (존 F. 케네디, 자기관리명언)
또 다른 경우는 연산자를 다시 로드할 때 참조를 사용해야 한다는 것입니다. 가장 일반적인 예는 연산자 [] 입니다. 이 연산자의 일반적인 용도는 값을 지정할 수 있는 대상 오브젝트를 반환하는 것입니다.
벡터 v (10); //크기가 10 인 성형 벡터를 작성합니다.
//Vector 는 표준 c 라이브러리의 템플릿입니다.
V [5] =10; //대입된 대상 객체는 연산자 [] 가 반환한 값입니다.
연산자 [] 가 포인터를 반환하면 다음 문은 다음과 같이 작성해야 합니다.
* v [5] =10;
그러나 이렇게 하면 v 가 벡터 포인터처럼 보입니다. 따라서 연산자를 참조로 반환하도록 선택할 수 있습니다.
개체를 가리켜야 하고 방향을 바꾸지 않으려는 것을 알고 있거나 불필요한 의미 오해를 방지하기 위해 연산자를 다시 로드할 때 포인터를 사용해서는 안 됩니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 예술명언) 다른 경우에는 포인터를 사용해야 합니다.