2014-09-29 2 views
2

C++ 클래스의 내 데이터 구조에서 우리는 이진 트리 작업을하고 있습니다. 코드 중 일부는 &과 *가 동시에 사용되는 (서로 바로 옆에있는) 장소를 포함하며 매우 혼란 스럽습니다.C++ * and & at

void balance(AvlNode * & t) 

은 이것이 사용되는 함수 정의의 한 예입니다. * 및 &은 어떻게됩니까?

편집 : 이것에 대한 대답은 내가 포인터와 참조에 대해 전혀 모르고 있다고 말했지만 소스는 모두 다른 것을 말합니다. 예를 들어 like here은 역 참조 연산자를 호출합니다. 한 곳에서이 모든 정보를 어디에서 찾을 수 있습니까? (안 유래 바람직)

+7

그것은 포인터에 대한 참조입니다 :

void balance(AvlNode * & t) {...} main() { AvlNode * a = new AvlNode(); balance(a); } 

는 동일합니다. – CoryKramer

+1

참조 및 포인터가 아직 마음에 들지 않으면 [매우 철저한 읽기입니다] (https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and -a-reference-variable-in? rq = 1). – CoryKramer

+0

http://c-faq.com/decl/spiral.anderson.html에서 "시계 방향 나선형 규칙"을 보시면 머리 속에서 이런 종류의 것들을 파싱 할 수 있습니다. – Dave

답변

1

그것은 형 AvlNode *

의 포인터 레퍼런스를 definitian는

#include <iostream> 

typedef int AvlNode; // It is not important what is the type AvlNode 

void balance(AvlNode * & t) 
{ 
    t = new AvlNode(10); 
} 

void another_balance(AvlNode * t) 
{ 
    t = new AvlNode(20); 
} 

int main() 
{ 
    AvlNode *p = NULL; 

    std::cout << (void *)p << std::endl; 

    another_balance(p); 

    std::cout << (void *)p << std::endl; 

    balance(p); 

    std::cout << (void *)p << std::endl; 
    std::cout << *p << std::endl; 

    delete p; 
} 
(이것은 메모리 누출이 있는지가 중요하지 않은 예시적인 목적을 위해), 예를 들면 고려이고

함수 호출의 결과를 고려하십시오. 는 "포인터 [A하기 |]"로하고 * |는 "[하는 A]를 참조하여"로 &를 읽고 1을 오른쪽에서 왼쪽으로 읽기

6

는, 당신은 얻을 수 있도록 "t이에 대한 참조입니다 AvlNode에 대한 포인터 "입니다. 이름이 선언의 형태로 외부로 선언되는 그것의 -


더 복잡한 경우에

1, 그것은 완전히 오른쪽에서 왼쪽으로 항상 아닙니다. 중첩 된 괄호가 여러 개있는 경우 이름에서 닫는 괄호로 이동 한 다음 일치하는 여는 괄호로 왼쪽으로 이동 한 다음 마지막으로 닫은 괄호로 바로 이동 한 다음 오른쪽 괄호까지 바꿉니다. 수평.

1

'&'문자는 함수 선언 또는 정의 안에서 사용될 때 C++에서 특별한 의미가 있습니다. "참조로 값 전달"을 의미합니다. "참조로 전달"하면 C++은 변수를 함수에 전달할 때 변수의 참조를 자동으로 작성한 다음 함수 내에서 자동으로 참조 해제합니다.

따라서이 함수는 t 유형의 변수 AvlNode *을 참조로 전달합니다. 따라서, 당신은 예를 들어, 그래서 AvlNode * & t

있습니다

void balance(AvlNode ** t_ptr) 
{ 
    AvlNode * t = *t_ptr; 
    ... 
} 

main() 
{ 
    AvlNode * a = new AvlNode(); 
    balance(&a); 
}