본문 바로가기

Programming/ C Language

[C] 함수 포인터란 무엇인가?

728x90
반응형

□ 함수 포인터란?

   ▷ 함수의 주소를 가리키는 포인터로 함수를 호출하거나 매개변수로 보낼 때 사용합니다.

 

□ 함수 포인터의 형태

   ▷ (반환 타입) (*함수포인터 명)(매개변수1, 매개변수2, …);

     Ex) int (*fp)(int, int);

 

 

□ 함수 포인터의 호출

   

 ▷ 일반적인 함수 호출

int sum(int fir, int sec){
	return fir + sec;
}

int main(void){

	printf("%d\n", add(10,5));

}

   

 ▷ 함수포인터를 사용한 호출

int sum(int fir, int sec){
	return fir + sec;
}

int main(void){

	int (*fp)(int, int);
    fp = add;
    printf("%d\n", fp(10,5);

}

   

 

 

 ▷ 함수포인터 배열을 사용한 호출

int fun1(int fir, int sec){ return fir + sec };
int fun2(int fir, int sec){ return fir - sec };
int fun3(int fir, int sec){ return fir / sec };
int fun4(int fir, int sec){ return fir * sec };

int main(void){

	int (*fp[4])(int, int) = {fun1, fun2, fun3, fun4};
    // int를 반환하며 (int, int)를 매개변수를 가지는 함수들을 가리키는 포인터가 4개가 있다.

    for(int ind = 0; ind < 4; ind++){
    	printf("%d\n", fp[ind](3,4));
    }
 
}

 

 ▷ 함수포인터를 매개변수로 보내기

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>  

#define loop(v, lo, hi) for((v)=(lo); (v)<(hi); (v)++)

int sum(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int multi(int a, int b) { return a * b; }
int divv(int a, int b) { return a / b; }
int mod(int a, int b) { return a % b; }


//3. int (*(calculator3(int (*fp[])(int, int), int arr_size)))(int, int)
// *(calculator3(int (*fp[])(int, int), int arr_size))은 함수포인터로 볼 수 있습니다.(ex. fp)
// int (*fp)(int, int) 형태를 호출한 곳으로 보내줍니다
// 예를 들어 random_Num이 2인 경우 fp[2]는 multi로 호출한 곳에 multi를 보내줍니다.

int (*(calculator3(int (*fp[])(int, int), int arr_size)))(int, int) {
                 //1. 함수포인터배열을 사용하여 매개변수로 받습니다.
	int low = 0;
	int high = arr_size - 1;
	int random_Num = rand() % high + low; //난수 발생범위를 low에서 high 범위내에 출력되는 코드
	return fp[random_Num]; //2. 임의의 수(0~4 사이)를 넣어 함수를 보냅니다.
}


int main(void) {
	int (*fpa[])(int, int) = { sum, sub, multi, divv, mod };
	
	int dx;

	srand(time(NULL));

	loop(dx, 0, 5)
	{
		Sleep(300);
		printf("random RUN!! : %d\n", calculator3(fpa, sizeof(fpa) / sizeof(fpa[0]))(10, 3));
        //4. 받아온 함수에 매개변수로 (10,3) 을 넣어 %d를 출력합니다.
	}
}

  ▶ 1. calculator3에 함수 포인터 배열을 사용하여 매개변수로 받아줍니다.

  ▶ 2. 임의의 수(0~4)를 넣어 fp[]를 반환합니다.

  ▶ 3. int (*fp)(int, int)형태 ex)random_Num이 2일경우 fp[2]는 multi로 multi함수의 주소를 보내줍니다.

  ▶ 4. 받아온 함수의 매개변수로 (10, 3)을 넣어 보내줘 %d를 출력하게 됩니다.

 

 

반응형