함수 포인터


함수의 이름은 메모리상에 저장된 함수의 주소값을 의미한다. 함수포인터를 이용하면 다른함수에 함수를 인자로 전달할 수 있다. 


함수 포인터의 선언


int SimpleFunc(int num); // 반환형이 int 이고 int형 매개변수를 1개 가지고있는 함수

int (*fptr) (int); // 반환형이 int 이고, int 형 매개변수 1개를 가지고있는 함수의 주소값을 저장할 수 있는 함수 포인터

fptr = SimpleFunc; // fptr 포인터 함수에 같은 매개변수형태와 반환형을 가지고있는 SimpleFunc 함수의 주소값을 저장

fptr(1) // fptr 포인터함수를 이용해 SimpleFunc 함수 호출 , SimpleFunc(1) 과 동일한결과를 보임


int simple (int. int ( *fptr)( int ) ){ ,,} // 함수를 인자로 받는 함수 선언

simple(1 , simpleFunc); // 함수인자 전달 


'형(TYPE )' 이 존재하지 않는 void 포인터


void * ptr;


void 형 포인터에는 어떤 변수의 주소값이든 담을 수 있다 . 함수의 주소값도 포함해서.

하지만 void형 포인터로는 어떠한 연산도 할 수 없다. 따라서 주소값의 저장에만 의의를 두고 , 포인터형은 나중에 결정하고싶을때 사용한다.



2차원 배열이름의 포인터형


int arr[3][4]일때 , arr은 이차원배열의 첫번째주소를나타내고, arr+1은 arr의 주소값에 sizeof(int)*4 값을 더한 주소값을 나타낸다 ( 다음행의 첫번째 열 주소값 ) 따라서 2차원 배열이름의 포인터형은 열의 길이에따라 달라진다.


2차원 배열의 포인터형 : int (*ptr)[4];

+1마다 얼마나 건너뛸건지 알려주기위해 선언에 열의길이를 입력해야한다.

 // int *ptr[4] 은 주소값을 저장하는 포인터 배열이다.


2차원 배열을 인자로 전달


int arr1[2][7];

double arr2[4][5];


void SimpleFunc ( int(*parr1)[7] , double(*parr2)[5] ) { ... }

혹은

void SimpleFunc ( int parr1[][7] , double parr [][5] ) { ... }

// 매개변수에 한해 , 둘다 같은 선언이다. 


2차원 배열에서도 arr[i] 와 *(arr+1)은 의미가 같다.


arr[2][1] = 4; 는 


*(arr+2)[1] = 4;

*(arr[2]+1) = 4;

*((arr+2)+1) = 4;


모두로 변환할 수 있다.

이중포인터는 포인터변수를 가리키는 또 다른 포인터변수를 뜻한다.


int num=4;

int *ptr = #

int ** dptr=&ptr; // ptr의 주소값을 저장하는 int 형 이중포인터

dptr은 &ptr을,  *dptr은 ptr의값(&num)을,  **dptr은 *ptr(num)값을 의미한다.

=> 만약 다른 함수안에서 ptr이 가리키는 값을 바꾸고싶다면, 매개변수로 이중포인터를 사용해서 ptr 의 주소값을 전달해야한다.


ex)

void SwapIntPtr( int ** dp1, int ** dp2 )

{

int *temp = *dp1;

*dp1 = *dp2;

*dp2 = *dp1;

}


포인터 배열과 포인터 배열의 포인터형


int * arr1[20]; // 길이가 20인 int 형 포인터배열


int num1=1,num2=2,num3=3;

int *ptr1=&num1;

int *ptr2=&num2;

int *ptr3=&num3;

int * PtrArr[3] = {ptr1,ptr2,ptr3};

int **dptr = PtrArr; // 포인터배열을 이중포인터로 받을 수 있다.



+ Recent posts