[완료] C++ Reference type 에 대한 의문점...
글쓴이: liveeasily / 작성시간: 목, 2010/03/18 - 4:15오후
안녕하세요,
C++ 중 Reference type 에 대한 의문점이 생겨서 도움을 구합니다.
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int temp = 0; // reference 선언과 동시에 초기화를 위해 임시변수 사용 6 int *p = NULL; 7 int &r = temp; 8 { 9 int a = 10; 10 p = &a; 11 r = a; 12 printf("a addr = %p\n", &a); 13 printf("r = %d\n", r); 14 printf("*p = %d\n\n\n", *p); 15 } 16 r = 5; 17 //*p = 100; 18 //printf("a = %d\n", a); // error 19 printf("r = %d\n", r); 20 printf("p = %p\n", p); 21 printf("*p = %d\n", *p); 22 }
[결과]
a addr = 0xbfac09f4
r = 10
*p = 10
r = 5
p = 0xbfac09f4
*p = 10
==============================================
reference type 을 그냥 포인터와 유사하다 정도로만 여기고 살아왔습니다
그래서 r 이라고 지칭되고 있는 메모리공간에는 실제 a 의 주소가 저장되었을 것이라고 제 멋대로 생각하고 있었습니다.
reference 가 사용될 때는 저장된 주소에 있는 값이 쓰이는 구나 라고 여겼습니다.
하지만 위의 소스를 실행해보니 그게 아니라는 생각이 드는군요.
만약 그랬더라면 두 번째 *p 의 값도 "5" 가 나왔을테니까요.
1. reference type 변수에 실제 저장된 값은 어떤 종류인가요?
2. 위의 소스처럼 reference 의 target 이 먼저 소멸되버린다면 어떤 일이 벌어질까요?
reference 의 정확한 개념이 잘 서질 않네요..
Forums:
http://www.parashift.com/c++-faq-lite/references.html
Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.
하지 말라는 짓을 하고 있었나 봅니다...
...
r을 포인터로 본다면, 11번째 줄은 그 포인터의 값을 바꾸는 것이 아니라 포인터가 가리키는 곳을 바꾸는 것입니다.
즉 p = &a에 대응하는 게 아니라 *p = a에 대응합니다. 레퍼런스는 한번 만들면 가리키는 곳을 나중에 바꿀 수 없습니다.
즉, (r을 포인터로 보는 관점에서) r은 temp의 주소를 저장한 포인터로 만들어져서 끝까지 그 주소값을 유지하고 있는 것입니다.
(그리고 맨 마지막의 *p는 이미 날아가버린 a라는 변수를 참조하고 있으므로 사실 잘못된 코드입니다. 그 시점에서 쓰레기값이 나오거나 프로그램이 죽을 수 있습니다.)
참조체는 초기화후
참조체는 초기화후 값 대입한 다음에는 다른 변수로 옮겨탈 수 없습니다.
위의 코드는 r=a 에서 결국 temp = a 한것과 같은 효과입니다.
댓글 달기