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++의 복사생성자 같이 필요불가결한 경우 아니면 별로 추천은 하지 않는다.
보통 함수의 인수를 비포인터 형식으로 전달할 때에는 그 값을 복사형식으로 전달하는구나 하고 생각하고
포인터로 전달하는 경우 포인트하는 값을 참조하거나 값이 변경가능하겠다고 생각하는 것이 일반적이다.
일종의 암묵적인 동의가 있는 셈이다.
이런 정형화 비슷한 룰을 깨는 것은 혼동만 줄 수 있고 굳이 적극적으로 할 필요는 없는 듯하다.
'C, C++ 문법' 카테고리의 다른 글
해시 ppt - 자료구조 (1) | 2008.09.12 |
---|---|
해싱 필요한 이유 - 기본 개념 (0) | 2008.09.12 |
An Introduction to Hashing (0) | 2008.09.12 |
DLL - 함수 호출시 __declspec(dllimport)의 사용과 미사용간 코드생성 차이점 (0) | 2008.09.02 |
__declspec( selectany ) declarator (0) | 2008.09.02 |
#undef THIS_FILE ...이게 먼가여? (0) | 2008.09.01 |
문자열(스트링) 전격 분석 (0) | 2008.09.01 |