4-5. 포인터 vs 참조

Crat3 ㅣ 2023. 5. 11. 18:15

1. 편의성 측면

참조가 포인터보다 더 간단하지만

참조 방법을 이용하면 원본의 값을 수정하는지 아닌지 알기 어려움

PrintInfo(&info);
PrintInfo(info);

위에서 첫 줄은 PrintInfo가 info의 주소값을 직접 찾아가 원본 값을 수정한다는 것을 알 수 있지만

두번째 줄은 PrintInfo가 info의 원본 값을 수정하는지 아닌지 알 수 없음.

 

(추가) 어떤 값을 수정하지 못하게 하려면 const 문법을 사용할 수 있다.

void PrintInfo(const StatInfo& info)
{
// ---------------------------------
}

(추가 2) 포인터 문법에서 const의 위치에 따라서 용법이 달라질 수 있다.

(1) 스타 앞에 붙는 경우

void PrintInfo(const StatInfo* info)
{
//---------------------------------
}

info가 가리키는 값을 바꿀 수 없게 함.

 

(2) 스타 뒤에 붙는 경우

void PrintInfo(StatInfo* const info)
{
//---------------------------------
info = &GlobalInfo // 작동하지 않음
}

info가 가리키는 주소값을 바꿀 수 없게 함.

 

2. 초기화 여부

참조 방식은 참조하는 대상이 없으면 안됨.

(무언가를 참조하고 있어야 함)

StatInfo& refer;
refer = info;
PrintInfo(refer);
// "오류 발생 !!"

StatInfo& refer = info;
PrintInfo(refer);

(추가) 포인터가 어떤 값도 가리키지 않으려면?

StatInfo* ptr = nullptr;

이 상태에서 해당 포인터를 사용하면 오류가 발생함.

어떤 조건을 만족하는 것을 찾지 못할 때 nullptr을 사용할 수 있음.

단, 참조 방식은 nullptr을 사용할 수 없다.

 

3. 포인터로 사용하던 것을 참조로 넘겨주거나, 참조로 사용하던 것을 포인터로 넘겨주려면?

(1) 포인터 -> 참조

PrintInfoByRef(*ptr);
// PrintInfoByRef(refer);

ptr의 값을 참조한다.

 

(2) 참조 -> 포인터

PrintInfoByPtr(&refer);
// PrintInfoByPtr(ptr);

refer의 주소값을 참조한다.

'기초 C++ 스터디' 카테고리의 다른 글

4-7. 포인터 vs 배열  (0) 2023.05.22
4-6. 배열  (0) 2023.05.22
4-4. 참조  (0) 2023.05.11
4-2. 포인터 연산  (0) 2023.05.11
4-1. 포인터  (0) 2023.05.11