F.R.I.D.A.Y.

포인터(pointer) part3. 함수 포인터 본문

DEV/C C++

포인터(pointer) part3. 함수 포인터

F.R.I.D.A.Y. 2020. 1. 30. 23:07
반응형

 포인터는 신기하게도 함수까지 가리킬 수 있습니다. 어차피 이름이 있으니 이름으로 사용하면 될 텐데 뭐가 좋으냐는 생각을 할 수 있겠지만 이번에 그 생각이 바뀌실 겁니다.

 

# 포인터에 대한 내용을 알고 있어야 합니다.


정적인 것은 싫어요

 무엇이든 코드에 명시되어 있다면 이를 수정하기 위해서는 전부 다시 컴파일을 진행해야 합니다. 그러나 포인터를 이용한다면 포인터만 명시되어있지 포인터가 가리키는 내용은 코드에 명시하지 않도록 할 수 있습니다. 따라서 포인터를 사용하면 컴파일을 하지 않고도 실제 작업 내용의 변경이 가능[# 게임을 예로 들면 사소한 버그는 패치로 바로잡곤 합니다. 그런 것이라고 보면 됩니다.]합니다.

 함수도 마찬가지입니다.


함수 포인터

 함수 포인터는 말 그대로 함수를 가리킬 수 있는 포인터입니다. 선언은 아래와 같이 이루어지게 됩니다.

return_type (*fp)(parameter);
  • return_type: 포인터 fp가 가리키는 함수의 반환 자료형입니다.
  • parameter: 포인터 fp가 가리키는 함수의 인자 목록입니다.

 예를 들어 abs[# stdlib.h 헤더 선언 후 사용 가능] 함수를 가리키는 함수 포인터를 선언한다고 가정합니다. 그러면 아래와 같이 반환 자료형과 인자 목록은 int로 작성해주어야 합니다.

int (*fp)(int) = abs;

 

 이렇게 선언된 fp를 이용할 때는 아래와 같이 이용할 수 있습니다.

(*fp)(-1);

// ex)
printf("%d\n", (*fp)(-10));
// result: 10

 함수 포인터도 결국 포인터이기 때문에 간접 참조 연산자를 작성해주어야 합니다. 그러나 값을 저장한 공간에 접근하는 일반적인 포인터와는 달리, 함수 포인터는 기계어 코드 부분을 가리킵니다. 게다가 가리키는 함수를 이용하고자 할 때는 함수 호출 연산자인 소괄호를 꼭 작성해주어야 하기 때문에 간접 참조 연산자를 사용하지 않아도 실행이 가능[# 다만 일부 컴파일러의 경우 이 기능을 제공하지 않을 수 있습니다.]합니다.

// 이렇게도 이용할 수 있습니다.
printf("%d\n", fp(-10));
// result: 10

문제 풀기

 말로만 해선 습득할 수 없습니다. 직접 코드로 구현해보겠습니다.

Q.
 함수 포인터를 이용해 사칙연산 프로그램 만들기.  plus, minus, mul, div 함수를 호출하지 않고 함수 포인터로 호출하기.

 Base Code.

#include <stdio.h>

int plus(int a, int b){
    return a + b;
}
int minus(int a, int b){
    return a - b;
}
int mul(int a, int b){
    return a * b;
}
int div(int a, int b){
    return a / b;
}

int main(void){
    char ch;
    int a, b;
    
    [return_type] (*fp)(parameter) = NULL;
    
    scanf("%d %c %d", &a, &ch, &b);
    
    // 올바른 함수를 가리킬 수 있도록 작성하기
    
    printf("결과 값: %d\n", fp(a,b));
    
    return 0;
}

 이 문제에 대한 답은 아래와 같습니다.

더보기

# 문제 답

#include <stdio.h>

int plus(int a, int b){
    return a + b;
}
int minus(int a, int b){
    return a - b;
}
int mul(int a, int b){
    return a * b;
}
int div(int a, int b){
    return a / b;
}

int main(void){
    char ch;
    int a, b;
    
    int (*fp)(int, int) = NULL;
    
    scanf("%d %c %d", &a, &ch, &b);
    
    switch(ch){
        case '+':
            fp = plus;
            break;
        case '-':
            fp = minus;
            break;
        case '*':
            fp = mul;
            break;
        case '/':
            fp = div;
            break;
        default:
            fp = plus;
    }
    
    printf("결과 값: %d\n", fp(a,b));
    
    return 0;
}

더 읽어보기

 

포인터(pointer) part4. 함수 포인터 배열

함수 포인터 또한 자료형입니다. 모든 자료형은 배열로 만들 수 있다고 했는데요, 이번에는 함수 포인터 배열을 만들어봅니다. # 배열, 함수 포인터를 먼저 알고 있어야 합니다. 선언 방법 먼저 배열의 선언 방법..

pang2h.tistory.com

 

 

함수 포인터를 배워야 하는 이유 : 코드 간결화

많은 사람들이 C언어를 배우기 시작하다가 중간에 막히는 부분이 있습니다. 대표적으로 포인터가 있는데요, 이번에 배울 것 또한 포인터입니다. 이번에 배울 포인터는 기존의 포인터와는 약간 다른, 함수 포인터입..

pang2h.tistory.com

# index

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

부동소수점  (2) 2020.02.22
포인터(pointer) part4. 함수 포인터 배열  (0) 2020.01.30
구조체(struct) part2. 비트 필드  (0) 2020.01.29
공용체(union) part1. default  (0) 2020.01.28
포인터의 크기  (0) 2020.01.26
Comments