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를 출력하게 됩니다.
반응형
'Programming > C Language' 카테고리의 다른 글
[C] 싱글 링크드 리스트(Single Linked List) (0) | 2019.06.18 |
---|---|
[C] 반복문에 대해서 알아보자! (0) | 2019.06.15 |
[C] 함수 프로토타입이란 무엇일까? (0) | 2019.06.15 |
[C]비트연산자란 무엇인가? (0) | 2019.06.15 |
[C] Enum(열거형)에 대해 알아보자 (0) | 2019.06.15 |