2013. 4. 29. 16:45
다음의 내용은 Rushmo에서 포인터 교육 자료로 만든 내용입니다.
가져 가실때는 이 정보 남겨 주시는것이 예의 겠지요 ^^
변수가 생성되면 그 메모리상에 위치가 지정되듯이 함수가 선언되면 link후에 각각 함수는 메모리 상에 특정 위치에 존재하게 된다.
이 함수의 주소값을 저장하기 위한 것이 함수 포인터 이다.
함수 포인터는 일반적인 프로그래밍에서 자주 보지만 인식하지 못하고 있는 부분 중에 하나이다.
예를 들면 쓰래드를 생성할 때 아래와 같이 한다.
DWORD ThreadFunc( LPVOID lpParam )
{
}
hThread = CreateThread(NULL,0,ThreadFunc,pData,0,&dwThreadId[i]);
CreateThread() 함수의 세번째 인자로 함수를 받고 , 그것을 내부적으로 저장하는 변수가 있게 된다.
실제로 CreateThread() 의 내부에서는 외부에서 등록한 ThreadFunc()를 함수 포인터 방식을 이용해 호출 하게 된다.
이런 형태를 구현할 때 실제 코드는 아래와 같이 된다.
int FunctionPointer1(int a, int b)
{
return a + b;
}
int FunctionPointer2(int a, int b)
{
return a * b;
}
void PointerStudy_4()
{
int (* CallFuncPtr)(int a, int b); (1) 함수 포인터(변수)를 생성
CallFuncPtr = FunctionPointer1; // runtime binding
printf("return = %d \r\n",CallFuncPtr(1,2) );
CallFuncPtr = FunctionPointer2;
printf("return = %d \r\n",CallFuncPtr(1,2) );
}
위의 코드에서는 CallFuncPtr이 함수 포인터(변수)가 된다.
이 변수는 특별히 동일한 리턴 형식과 동일한 파라메터를 받는 형식만 대입 가능한 변수가 된다.
또한 변수의 호출이 함수의 호출과 동일하게 되는 것이다.
l 일반적으로는 DLL 를 로드(LoadLibrary) 하고 해당 DLL에 있는 함수의 주소를 (GetProcAddress) 가져온 뒤에 그것을 함수 포인터 변수에 저장한 뒤 해당 함수를 호출 할 때 많이 사용한다.
l 하지만 과거 Class의 Virtual Function 개념이 존재 하지 않는 C 언어에서는 함수 포인터를 이용해서 Run-time binding 기법을 구현했었다.
l 위의 CreateThread() 함수의 경우에서처럼 라이브러리 내부에서 외부의 함수를 호출하려면 파라메터를 통해서 등록해 주는 방법 밖에 없다.
댓글 없음:
댓글 쓰기