함수 포인터
: 함수 포인터란, 함수를 가르키는 포인터이다. 즉 함수의 주소를 가질 수 있다.
[형식]
반환형 (* 함수 포인터 이름)(매개 변수1, 매개 변수2, ...);
//예시
int (*pf)(int, int);
함수 포인터는 따로 body가 필요하지 않다.
또한 배열처럼 함수 이름 자체가 주소이기 때문에 주소 연산(&)는 필요하지 않다.
[예시 - 1]
#include<stdio.h>
void A(){
printf("A입니다.");
}
void B(){
printf("B입니다.");
}
void C(){
printf("C입니다.");
}
int main(){
int x = 0;
void(*p)();
printf("함수 명을 선택하시오. (A: 0, B: 1, C: 0): ");
scanf("%d", &x);
switch (x)
{
case 0:
p = A; //함수 포인터에 함수(주소) 전달
break;
case 1:
p = B; //함수 포인터에 함수(주소) 전달
break;
case 2:
p = C; //함수 포인터에 함수(주소) 전달
break;
default:
break;
}
p(); //전달 받은 함수 실행
}
// 함수 명을 선택하시오. (A: 0, B: 1, C: 0): 1
// B입니다.
이렇게 함수를 case마다 선언하지 않고 함수 포인터에 함수를 전달해서 전달 받은 함수를 함수 포인터로 실행시킬 수 있다.
함수 포인터에 함수를 전달하려면 반환 타입과 입력 타입이 같아야한다.
[예시 - 2]
#include<stdio.h>
//교재 보고 변형한 버전
int add(int x, int y){
return x+y;
}
int sub(int x, int y){
return x-y;
}
int main(){
char op = ' ';
int a = 0, b = 0;
int (*pf)(int, int);
printf("덧셈과 뺄셈을 정하고, 피연산자 2개를 입력하세요.(예시: 1 - 2): ");
scanf("%d %c %d", &a, &op, &b);
switch (op)
{
case '+':
pf = add; //함수 포인터에 함수(주소) 전달
break;
case '-':
pf = sub; //함수 포인터에 함수(주소) 전달
break;
default:
break;
}
printf("%d", pf(a, b)); //전달 받은 함수 실행
}
// 덧셈과 뺄셈을 정하고, 피연산자 2개를 입력하세요.(예시: 1 - 2): 2 + 3
// 5
'2학년 2학기 > c언어' 카테고리의 다른 글
10-1장 문자열과 NULL 문자 (1) | 2024.11.04 |
---|---|
9-7장 이중 포인터 (1) | 2024.10.29 |
9-5장 함수가 포인터를 반환하는 경우 (0) | 2024.10.29 |
9-4장 배열과 포인터 (0) | 2024.10.28 |
9-3장 포인터와 함수 (0) | 2024.10.28 |