포인터 사용법
이중포인터 , 2중포인터 , 다중포인터 , 배열 , 함수 인자
//=========
//이중 포인터
//이중포인터를 통해 배열을 함수 인자로 주고 받기
//이중포인터를 줄때는 고정된 배열은 가능한 한 사용하지 않는다.
void d_ptr2( char **arr_)
{
char *p= (char*)*arr_;//char *heap = (char*)malloc(11); 와 stack
//주의! 고정된 배열 char arr[10];에선 에러
//char *p= (char*)arr_;//고정된 배열 char arr[10];
memcpy( p +0 , "mem", 3);
//memcpy((char*)*arr_+0, "mem", 3);//위와 동일 , 포인터 타입 캐스팅 항상 따라야 한다.
return ;
}
//======
void _Test()
{
int size=0;
//선언, 할당
char arr[10];
char *heap = (char*)malloc(11);
char *stack = (char*)alloca(12);//스택 메모리는 자동 해제
//초기화
memset(arr,0, sizeof(arr));
size = _msize(heap);//heap 영역 크기 알아내기,VC만 가능 ,
memset(heap, 0, size);
//size = _msize(stack);//stack 영역은 안됨
memset(stack, 0, 12);
//함수 이용
//d_ptr2( (char**)&arr);//함수 내에서 char *p= (char*)*arr_;로 처리하면 에러
//이중포인터로 넘길때는 고정된 배열은 가능한 한 사용하지 않는다.
d_ptr2( (char**)&heap);
d_ptr2( (char**)&stack);
...
}
//===========
* 스택
스택 기본 크기 : 1M (1024x1024=1,048,576 = 0x10,0000 )
늘리기 - Project Setting -> Link -> Output -> Stack Alloctaion : 0xa00000 (10M)
//=================================
//Pointer
int i=10,ret=0;
int *pi=&i; // int 포인터
int **ppi=π// 포인터의 포인터, 2중 포인터
//배열
int ai[3]={20,30,40};//int 배열, 포인터
int *pai[3]; //int 포인터 배열, 2중포인터
int **ppai[3]; //포인터의 포인터, 3중 포인터
ST2 ast[3];
ST2 *past[3];
ST2 **ppast[3];
/*
모든 변수와 함수, 문자열등은 주소를 가지고 있고,그 주소 정보를 다루는 것이 포인터
포인터도 변수 이므로 주소를 가지고 있다.
함수 포인터의 경우 함수의 주소를 가지고 있는데, 그 함수의 주소(함수포인터의 값)을 바꾸면, 함수가 바뀌는 결과
- API Hook
*/
//=============================================================
//일반적 사용
//fn1(&i); fn1(pi);
//fn2(&(&i)); //ERROR !!!
//fn2(&pi); fn2(ppi);
//=============================================================
//배열
fn1(ai);
pai[0]=&ai[0]; pai[1]=&ai[1]; pai[2]=&ai[2];
fn2(pai);
//구조체
//=============================================================
//함수 포인터
int (*fpfn1)(int *pi1, ST2 *pst2=NULL);
typedef int (*fpFN22)(int *pi1, ST2 *pst2=NULL);//함수 포인터를 변수로 활용
fpFN22 fpfn22;
fpfn22(pi);
fn1(pi);
i=0;
fpfn1 = fn1;
ret= fpfn1(pi);
i=0;
fpfn1 = fn12;
ret = fpfn1(pi);
//
HMODULE hMod = GetModuleHandle(NULL);
//HINSTANCE hInst = GetInstance();
FARPROC proc = (FARPROC)GetProcAddress(hMod, "fn1");//Export 된 함수의 주소만 알수 있다. 현재 모듈의 함수는 그냥 함수 참조
DWORD dw = GetLastError();//126 = ERROR_MOD_NOT_FOUND, 127=ERROR_PROC_NOT_FOUND
//=============================================================
참고 사이트
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/FunctionPointer
'Code' 카테고리의 다른 글
RTTI (0) | 2012.08.19 |
---|---|
pragma 정리 (0) | 2012.08.19 |
GNU선언문 (0) | 2012.08.19 |
GDI+ ( Graphics Device Interface +) gdi정리 (0) | 2012.08.19 |
Export 함수 이름 변경방지 (0) | 2012.08.19 |