2012-07-20 3 views
3

다른 변수를 가리키는 포인터를 지정하려면 변수에 주소를 &으로 지정하여 포인터를 지정합니다.C++에서 참조 초기화

int foo = 10; 
int *bar = &foo; 

지금 위와 같은 논리를 따르고 대신 참조 유형을 만듭니다.

int foo = 10; 
int &bar = &foo; 

나는 이것이 효과가 있다고 생각하지만 그렇지 않습니다. 왜?

+0

나는 지식에 대한 당신의 탐구에 박수를 보냅니다.하지만이 방법으로 참조를 만드는 것이 완전히 무의미하다고 생각할 수는 없습니다. –

+0

그 주석만큼 거의 무의미합니다. 나는이 두 가지 예가 어떻게 다른지 이해하려고 애를 썼다. – Carlj901

+0

아무도 의도하지 않았으므로 불쾌감을 느끼지 마십시오. 나는 내가 알지 못했던 이것을위한 유스 케이스에 대해 깨달을 수 있기를 바랄 뿐이었다. –

답변

3

포인터와 참조가 같은 것이 아니기 때문에. 참조는 "다른 이름"또는 "별칭"을 의미하는 것으로 생각할 수 있습니다.

즉, bar은 예제에서 foo의 또 다른 이름입니다. int &bar = foo;을 수행 할 때 barfoo의 다른 이름으로 사용하려면 foo의 주소를 bar에 할당하지 않으려합니다. 그러나 포인터는 가리키는 객체의 주소를 저장하므로 포인터를 사용하여 주소가 foo 인 주소를 가져와 bar 포인터에 할당해야합니다.

+0

컴파일러는 어떻게 해석할까요?작업이 실제로 foo에서 수행 될 것인가? 예 : bar가 foo로 대체되거나 foo에 대한 포인터로 작동하지 않을 것인가? – Carlj901

+1

@ user1047423 : 구현 정의입니다. C++ 표준은 참조에 저장 영역이 있는지 여부는 지정되지 않았습니다. 즉, 컴파일러 작성자는 원하는 것을 자유롭게 할 수 있습니다. 일반적으로 포인터가 사용되지만 구현은 모든 막대를 제거하고 foo도 사용합니다. –

4

구문은

int &bar = foo; 

wikipedia를 참조한다.

+0

왜 작동하지 않는지 궁금합니다. – Carlj901

+0

컴파일러는 내부적으로'bar' 포인트를'foo'로 만들고 그 일은 백그라운드에서 발생합니다. 그것이 작동하지 않는 이유입니다. – badmaash

+0

@badmaash : 컴파일러는'bar'라고하는 모든 장소를 취해 그것을 포인터를 사용하지 않고'foo'로 대체 할 수 있습니다. –

2

참조를 참조 할 때와 동일한 유형으로 초기화해야하므로 작동하지 않습니다.

int foo = 10; 
int &bar = foo; 

당신이 이런 식으로 초기화 할 때 : 당신은 포인터 - 투 - INT와의 int 참조를 초기화하려는

int &bar = &foo; 

를이 경우. 유형이 일치하지 않습니다.

참조는 포인터와 같지 않지만 컴파일러가이를 포인터로 구현할 수 있습니다. 참조는 기본적으로 "내가 바를 언급 할 때, 나는 정말로 foo에 대해 말하고있다"라고 말한다.