Pointer Test

Code 2012. 8. 19. 21:12

포인터 사용법

이중포인터 , 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
Posted by codens