[42Seoul] 함수 포인터42 Seoul2021. 5. 8. 12:31
Table of Contents
함수 포인터를 만들거나, 구조체에 함수 포인터를 넣거나 반환 값으로 함수포인터를 줄 수도 있다.
함수 포인터는 함수를 저장하는 포인터를 뜻하며, 함수 포인터를 주고 받거나 함수 포인터로 함수를 호출할 수 있다.
1. 반환값과 매개변수가 없는 함수 포인터 ▶ void (*fp)();
void hello()
{
printf("Hello, World!\n");
}
int main()
{
void (*fp)();
fp = hello;
fp();
return (0);
}
2. 반환값과 매개변수가 있는 함수 포인터 ▶ int (*fp)(int, int);
int add(int a, int b)
{
return a + b;
}
int mul(int a, int b)
{
return a * b;
}
int main()
{
int (*fp)(int, int);
fp = add;
printf("%d\n", fp(10, 20));
fp = mul;
printf("%d\n", fp(10, 20));
return (0);
}
위의 사항을 응용하기
int add(int a, int b)
{
return a + b;
}
int mul(int a, int b)
{
return a * b;
}
int main()
{
int funcNumber;
int num1, num2;
int (*fp)(int, int) = NULL;
printf("함수 번호와 계산할 값 입력 : )"
scanf("%d %d %d\n", &funcNumber, &num1, &num2);
switch (funcNumber)
{
case 0:
fp = add;
break;
case 1:
fp = mul;
break;
}
printf("%d\n", fp(num1, num2));
return (0);
}
int add(int a, int b)
{
return a + b;
}
int mul(int a, int b)
{
return a * b;
}
int main()
{
int funcNumber;
int num1, num2;
int (*fp[2])(int, int);
// int (*fp[2])(int, int) = {add, mul};
fp[0] = add;
fp[1] = mul;
printf("함수 번호와 계산할 값 입력 : )"
scanf("%d %d %d\n", &funcNumber, &num1, &num2);
printf("%d\n", fp(num1, num2));
return (0);
}
struct Calc {
int (*fp)(int, int);
};
int add(int a, int b)
{
return a + b;
}
int main()
{
struct Calc c;
c.fp = add;
printf("%d\n", c.fp(10, 20));
return (0);
}
★★★ 함수 포인터를 함수의 매개변수로 사용하기
void executer(int (*fp)(int, int))
{
}
int add(int a, int b)
{
return a + b;
}
void executer(int (*fp)(int, int))
{
printf("%d\n", fp(10, 20));
}
int main()
{
executer(add);
return 0;
}
함수 포인터를 함수의 반환값으로 사용하기
int (*getAdd())(int, int)
{
}
int add(int a, int b)
{
return a + b;
}
int (*getAdd())(int, int)
{
return add;
}
int main()
{
printf("%d\n", getAdd()(10, 20)); // 30: getAdd를 호출한 뒤 반환값으로 add 함수 호출
return 0;
}
매개변수가 있는 함수에서 함수 포인터 반환하기
int (*getAdd(int x, int y))(int, int) // 함수 포인터 반환, int형 매개변수 두 개
{
printf("%d %d\n", x, y); // x, y는 getAdd 함수의 매개변수
return add;
}
int main()
{
printf("%d\n", getAdd(8, 9)(10, 20)); // 8, 9는 getAdd에 전달
// 10, 20은 getAdd에서 반환된 add에 전달
return 0;
}
typedef 반환값자료형 (*함수포인터별칭)(매개변수자료형1, 매개변수자료형2);
typedef int (*FP)(int, int);
int add(int a, int b) // int형 반환값, int형 매개변수 두 개
{
return a + b;
}
typedef int (*FP)(int, int); // FP를 함수 포인터 별칭으로 정의
struct Calc {
FP fp; // 함수 포인터 별칭을 구조체 멤버 자료형으로 사용
};
void executer(FP fp) // 함수 포인터 별칭을 매개변수 자료형으로 사용
{
printf("%d\n", fp(70, 80));
}
int main()
{
FP fp1; // 함수 포인터 별칭으로 변수 선언
fp1 = add;
printf("%d\n", fp1(10, 20)); // 30
FP fp[10]; // 함수 포인터 별칭으로 배열 선언
fp[0] = add;
printf("%d\n", fp[0](30, 40)); // 70
struct Calc c;
c.fp = add;
printf("%d\n", c.fp(50, 60)); // 110
executer(add); // 150: executer를 호출할 때 add 함수의 메모리 주소를 전달
return 0;
}
https://dojang.io/mod/page/view.php?id=591
'42 Seoul' 카테고리의 다른 글
[42Seoul] libft (part . bonus) (0) | 2021.05.11 |
---|---|
[42Seoul] libft (part. 2) (0) | 2021.05.09 |
[42Seoul] libft (part. 1) (0) | 2021.05.03 |
[42Seoul] cat 구현하기 (0) | 2021.04.22 |
[42Seoul] basename 이름만 보이는 함수 (0) | 2021.04.22 |
@jaewpark :: 코스모스, 봄보다는 늦을지언정 가을에 피어나다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!