본문 바로가기
2학년 2학기/c언어

9-6장 함수 포인터

by kkkkk1023 2024. 10. 29.

함수 포인터

: 함수 포인터란, 함수를 가르키는 포인터이다. 즉 함수의 주소를 가질 수 있다.

 

[형식]

반환형 (* 함수 포인터 이름)(매개 변수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