[C] 함수 포인터

2021. 9. 14. 19:09·C/문법

# 함수 포인터

함수를 가리킬 수 있는 포인터를 말한다.

함수에도 주소가 존재한다!

 

# 함수 포인터를 선언하는 방법

1. 반환값과 매개변수가 없는 함수

함수 포인터의 선언은 다음과 같이 이루어진다.

void (*함수포인터이름)();

예제)

#include <stdio.h>

void hello()
{
    printf("Hello, world!\n");
}

void from()
{
    printf("I'm from Korea.\n");
}

int main()
{
    void (*fptr)();

    fptr = hello;
    fptr();

    fptr = from;
    fptr();

    return 0;
}

--> void (*fptr)();을 통해 함수 포인터 fptr을 선언

--> hello 함수를 fptr에 저장해서 사용. (이때, hello()가 아닌 hello라는 것 주의!)

함수 포인터로 함수를 호출하기 위해서는 포인터에 ()를 붙이면 된다.

--> from 함수도 fptr에 저장해서 사용.

 

2. 반환값과 매겨변수가 있는 함수

반환값이나 매개변수가 존재할 경우에는 다음과 같이 선언한다.

반환자료형 (*함수포인터이름)(매개변수자료형1, 매개변수자료형2, ...);.

예제)

#include <stdio.h>

int sum(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b ;
}
int main()
{
    int (*fptr)(int, int);

    fptr = sum;
    printf("%d\n", fptr(20, 10));

    fptr = sub;
    printf("%d\n", fptr(20, 10));

    return 0;
}

--> int (*fptr)(int, int);를 통해 함수 포인터를 선언

--> fptr에 함수 이름을 저장해서 사용.

--> 함수 포인터를 호출하면서, 매개변수에 값을 넣어준다.

 

# 함수 포인터를 사용하는 이유

제일 간단한 이유는, 코드의 간결성 때문이다.

이를 보여주는 예시는 다음과 같다. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void zero()
{
    printf("0 입니다.");
}
void one()
{
    printf("1 입니다.");
}
void two()
{
    printf("2 입니다.");
}
void three()
{
    printf("3 입니다.");
}

int main(void) {
    int sel;
    printf(" 0 ~ 3중에 골라주세요. \n");
    scanf("%d", &sel);
    switch (sel)
    {
    case 0:
        zero();
        break;
    case 1:
        one();
        break;
    case 2:
        two();
        break;
    case 3:
        three();
        break;
    }

    return 0;
}

이 긴 코드를 함수 포인터를 사용하면 다음과 같이 간결하게 줄일 수 있다.

int main(void) {
    int sel;
    printf(" 0 ~ 3중에 골라주세요. \n");
    scanf("%d", &sel);

    void (*fptr[4])() = { zero, one, two, three };
    fptr[sel]();


    return 0;
}

--> 여기서, *fptr[4]는 크기가 4인 1차원 배열을 의미한다.

2차원 배열의 경우, 괄호를 써준다. ex) (*fptr)[4]

 

  • 함수 포인터를 사용하면 CallBack 매커니즘을 구현할 때 함수를 또 다른 함수의 인자로 넘겨주기 위해 주로 사용된다. 소스코드에서 상호간에 함수명을 지정할 필요가 없는 자유를 제공한다.
  • 동적으로 늘어나거나, 줄어드는 UI에 이벤트 핸들러를 붙이거나 뗄 때, 이를 효율적으로 관리하기 위해 함수 포인터를 사용하면 간편하다.

'C > 문법' 카테고리의 다른 글

[C] 헤더파일  (0) 2021.09.23
[C] 문자열 함수  (0) 2021.09.17
[C] 2차원 배열 + 이중포인터  (0) 2021.09.13
[C] 이중포인터  (0) 2021.09.10
[C] 2차원 배열  (0) 2021.09.10
'C/문법' 카테고리의 다른 글
  • [C] 헤더파일
  • [C] 문자열 함수
  • [C] 2차원 배열 + 이중포인터
  • [C] 이중포인터
Rix
Rix
  • Rix
    The Nights
    Rix
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (106)
      • 알고리즘 (5)
        • Python (1)
        • C++ (6)
      • CS (0)
      • Backend (20)
        • 로드맵 (1)
        • Java (17)
        • Spring (2)
      • TIL (0)
      • Flutter (13)
      • Python (7)
        • 디스코드 챗봇 (1)
        • 문법 (1)
        • 머신러닝 (2)
      • C (28)
        • 문법 (19)
      • ETC (2)
        • Git (2)
        • GitHub (1)
        • Hacking (4)
      • Game (13)
        • Unity (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    절대강좌유니티
    1546
    TensorFlow
    문자열 함수
    이미지분류
    콘솔창
    코뮤니티
    공백포함
    백준
    nullsafety
    C
    1152
    미로찾기
    2차원 배열
    C심화
    Unity
    Failed to create GICache
    DART
    이중포인터
    c언어
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
Rix
[C] 함수 포인터
상단으로

티스토리툴바