C, C++ 문법

int *&a; 의 의미

디버그정 2008. 9. 3. 22:51

 int *&a; 의 의미
참 생소한 표현이다.

우선 다음을 보자.
int b = 10;
int &a = b;
b라는 변수 공간에 10을 넣고
a는 b의 레퍼런스로 작동한다.
실제로 컴파일된 어셈블리 코드를 보면
포인터와 동일한 구조로 처리하고 있음을 볼 수 있다.
한마디로 언어에서 편의성 차원에서 허용한 개념임을 알 수 있다.
익히 알려진 c++ 복사생성자가 인수를 레퍼런스로 처리를 한다.

.................................................................
int *&a; 의 의미를 보기위해 다음 예제를 보자.
int a = 10;
int *b = &a;
int *&c = b;
이중포인터를 레퍼런스로 표현한 개념이다. *& 표시 순서를 주의하자.
레퍼런스하는 대상이 포인터일 뿐이다.
컴파일 코드를 보면 이전 예를 통해 짐작할 수 있듯이 이중포인터의 처리와 같다.

.....................................
실제로 도움이 되는 사용예를 보자.
보통 포인터를 수정하기 위해서는 함수의 인수로 이중포인터를 전달해야 한다.
이 경우
void Fun(int **ppInterface){
 *ppInterface = (int*)0x00467700;
}
// 사용하는 경우
int *pInter = NULL;
Fun(&pInter);

레퍼런스를 이용하면
void Fun(int *&pInterface){
 pInterface = (int*)0x00467700;
}
// 사용하는 경우
int *pInter = NULL;
Fun(pInter);

실질적으로 &를 앞에 붙일 필요가 없다는 점에서 편리하기는 하다.

이러한 장점이 있지만 c++의 복사생성자 같이 필요불가결한 경우 아니면 별로 추천은 하지 않는다.
보통 함수의 인수를 비포인터 형식으로 전달할 때에는 그 값을 복사형식으로 전달하는구나 하고 생각하고
포인터로 전달하는 경우 포인트하는 값을 참조하거나 값이 변경가능하겠다고 생각하는 것이 일반적이다.
일종의 암묵적인 동의가  있는 셈이다.
이런 정형화 비슷한 룰을 깨는 것은 혼동만 줄 수 있고 굳이  적극적으로 할 필요는 없는 듯하다.