2011-08-09 5 views
1

정수 변수를 가리키는 포인터가 있습니다. 그런 다음이 포인터를 참조 변수에 할당합니다. 이제 포인터가 다른 정수 변수를 가리 키도록 변경하면 참조 변수의 값이 변경되지 않습니다. 왜 그 이유를 설명 할 수 있습니까?참조 변수 및 포인터 문제

int rats = 101; 
int * pt = &rats; 
int & rodents = *pt;        // outputs  
cout << "rats = " << rats;       // 101 
cout << ", *pt = " << *pt;       // 101 
cout << ", rodents = " << rodents << endl;   // 101 
cout << "rats address = " << &rats;     // 0027f940 
cout << ", rodents address = " << &rodents << endl; // 0027f940 
int bunnies = 50; 
pt = &bunnies; 

cout << "bunnies = " << bunnies;     // 50 
cout << ", rats = " << rats;      // 101 
cout << ", *pt = " << *pt;       // 50 
cout << ", rodents = " << rodents << endl;   // 101 
cout << "bunnies address = " << &bunnies;   // 0027f91c 
cout << ", rodents address = " << &rodents << endl; // 0027f940 

우리는 토끼에게 pt를 할당했지만 설치류의 가치는 여전히 101입니다. 이유를 설명하십시오.

int & rodents = *pt; 

답변

2

라인은 pt (즉 rats)을 가리키고 있는지에 대한 참조를 생성한다. 포인터 pt에 대한 참조가 아닙니다.

나중에 ptbunnies을 가리 키도록 지정하면 rodents 참조가 변경 될 것으로 예상되지 않습니다.

편집 : @Als 점을 설명하기 위해 다음 코드를 살펴

int value1 = 10; 
int value2 = 20; 
int& reference = value1; 
cout << reference << endl; // Prints 10 
reference = value2; // Doesn't do what you might think 
cout << reference << endl; // Prints 20 
cout << value1 << endl; // Also prints 20 

두 번째 reference 할당 하지 변화 참조 ltself 않습니다. 대신 할당 연산자 (=)를 참조 된 것에 적용합니다 (value1).

reference은 항상 value1을 참조하며 변경할 수 없습니다.

처음에는 머리를 쓰는 것이 조금 까다 롭습니다. 따라서 Scott Meyer의 우수 서적 Effective C++More Effective C++을 살펴 보는 것이 좋습니다. 그는이 모든 것을 내가 할 수있는 것보다 훨씬 잘 설명한다.

+1

그래서 설치류가 하나의 변수에 할당되면 다른 변수를 다시 참조 할 수 없다는 것을 의미합니다. – Naphstor

+0

@Naphstor : 맞습니다. 참조는 다른 변수를 참조 할 수 없으며 항상 바인딩 된 변수에 대한 참조로 남아 있습니다. –