2014-12-15 3 views
3

이진 검색 트리를 만들려고합니다. 트리에 노드를 삽입하는 재귀 프로 시저를 사용했습니다. 코드는 다음과 같습니다.C++ 포인터와 참조 포인터

void BST :: insertRoot(Node* node, int data) { 
    if (node == NULL) 
     this -> root = new Node(data); 
    else 
     insertOthers(node, data); 
} 
void BST :: insertOthers(Node* node, int data) { 
    if(node == NULL) { 
      node = new Node(data); 
      return; 
    } 
    if(data < node->getData()) 
     insertOthers(node->getLeft(), data); 
    else 
     insertOthers(node->getRight(), data); 
} 

이 코드에서는 하나의 노드 만 트리에 삽입 된 다음 연결이 끊어집니다. 그러나 내가 Node*Node*&으로 변경하면 완벽하게 작동합니다. 아직도 나는이 둘의 차이점을 이해하지 못한다. 누구나 메모리 맵핑을 통해이 둘 사이의 차별화를 설명 할 수 있습니까? 고마워요

+0

다른 질문 [내가 최근에 대답] (http://stackoverflow.com/a/27452472/10077)과 같은 문제가 있습니다.큰 차이점은 C, 이것이 C++입니다. 그러므로 한 가지 방법 (아마도 최선은 아님)은'Node * &'로했던 것처럼 포인터에 대한 참조를 전달하는 것입니다. –

+0

'Node *'는 다른 모든 변수와 관계없이 별도의 포인터 값입니다. 'Node * &'는 다른 포인터를 가리키는 참조입니다. 예를 들어 다른 객체를 가리 키도록 변경하면 참조 대상도 변경됩니다. – cdhowie

답변

3

당신은 값으로 포인터 매개 변수를 사용하는 경우 :

Node* node 

다음 수정 :

node = new Node(data); 

함수 내에서 지역 변수를 변경합니다; 호출자의 주장은 아닙니다. 이 새로운 가치는 사라지고 나무는 그대로 남아있게됩니다.

(즉 포인터 참조하지 참조 포인터이다) 참조로 전달

:

Node*& node 

로컬 파라미터는 상기 호출자의 인수와 같은 포인터를 참조한다는 것을 의미하므로 호출자 볼 그것은 새로운 가치로 바뀝니다. 따라서 논리의 나머지 부분이 정확하다고 가정하면 원하는대로 새 노드를 가리 키도록 트리 내의 포인터를 업데이트합니다.

0

표기법 Node*은 'Node'에 대한 포인터를 의미하고, 두 번째 포인터는 Node에 대한 포인터를 의미합니다. 차이점은 첫 번째 포인터는 주소 사본을 제공하며 호출자에게 효과가 표시되도록 포인터를 현재 위치로 변경하는 것을 허용하지 않는다는 점입니다.

+1

'Node * &'가''Node'에 대한 포인터에 대한 참조를 말하면 더 쉬울 것이라고 생각합니다. " – cdhowie

+0

나는 그것을 바꿨다. 화제는 실제로 혼란이 예상되는 조금 fiddlish (그것이 낱말 인 경우에)이다. – Codor

0

값으로 포인터를 전달하면 함수는 포인터의 복사본을 매개 변수로받습니다. 복사본에 대한 액세스 권한 만 있기 때문에 함수 내에서 원래 포인터를 수정할 수 없습니다.

포인터를 참조로 전달하면 참조를 통해 원래 포인터를 수정할 수 있습니다. 그렇지 않으면 할당 된 노드가 누출 될 것이기 때문에 당신의 의도 인 것 같습니다.

의견을 기반으로 할 수 있지만 더 읽기 쉽도록이 함수를 다음과 같이 선언합니다 : Node* BST::insertOthers(int data) 포인터를 할당 된 노드로 반환하십시오.

0

포인터는 정수 값입니다. 값, int, double, float, 포인터, 포인터 등으로 값을 전달하면 해당 함수가 사본에서 작동합니다. 사본에 대한 변경 사항은 호출자에게 다시 전달되지 않습니다. 한마디로

는, 문제는이 다르지 않다 : 변경되지 않았습니다

void foo(int x) 
{ 
    x = 10; 
} 

int main() 
{ 
    int value = 0; 
    foo(value); 
    // value is still 0 after the call, not 10 
} 

value 것으로,이 foo에 전달 되었더라도. 변경 사항을 호출자에게 다시 반영해야하는 문제를 해결하려면 C++에서 참조를 전달합니다. 위의 경우 int에 대한 참조, 경우에 따라 Node*에 대한 참조를 전달합니다.