블로그 내에서 다른 포스팅 검색하기기
검색어를 입력해주세요

C언어에서 함수 포인터란?



포인터 변수에서 더 나아가 값을 저장할 수 있는 일반 변수에 함수를 가리키는 함수 주소값을 저장하면 이 변수가 곧 함수 포인터가 됩니다.
그리고 이 주소를 참조하여 변수에 저장된 함수를 호출할 수 있습니다.


즉, 동적으로 프로그램이 실행되는 과정에서 중간 중간 변수가 가리키는 함수의 주소를 바꾸면 호출할 함수도 바꿀 수 있다는 의미입니다.
이런 프로그래밍은 함수의 인자를 동적으로 변경시킬 수 있어 프로그램의 흐름을 효율적이고 유연하게 관리할 수 있도록 합니다.

 

함수포인터 구조



 

함수 포인터 변수 선언 예제


함수 포인터 변수를 선언하는 방법은 저장하려는 함수의 원형과 동일한 타입으로 선언해야 합니다.
예를 들어, 반환 타입이 int형이고 함수가 받는 인자의 타입이 char 타입 한개를 받는 함수라면 아래와 같이 선언합니다.

int (*func_ptr)(char);


위의 예제에서 func_ptr은 함수 포인터 변수의 이름이고 int는 함수의 반환 타입, (char)는 함수의 인수를 나타냅니다.

 

함수 포인터를 사용하여 함수 호출 예제


함수 포인터를 사용하여 함수를 호출하려면, 함수 포인터에 호출하려는 함수의 주소를 할당해야 합니다.
다음은 함수 포인터를 사용하여 char 인자 한개를 전달하는 print라는 이름의 함수를 호출하는 예제입니다

 

 

#include <stdio.h>

int print(char c) {
    printf("%c\n", c);
    return 1;
}

int main() {
    int (*func_ptr)(char) = print; // 함수 포인터에 print 함수 주소 할당
    int r = func_ptr(100); // 함수 포인터를 사용하여 함수 호출
    return 0;
}

 

구조체에 함수 포인터 변수 선언 예제


구조체 멤버로 함수 포인터를 가질 수도 있습니다.
다음은 구조체에 함수 포인터 변수를 선언하는 예제입니다


구조체란 연속된 변수 집합이다.

 

구조체 멤버인 함수 포인터를 통해 함수 호출 예제


구조체 멤버인 함수 포인터를 통해 함수를 호출할 때는 구조체 변수를 사용하여 접근합니다.
다음은 구조체 멤버인 함수 포인터를 통해 math.funcPtr이 가리키는 함수를 호출하는 예제입니다


typedef struct {
    int (*func_ptr)(char);
} printer_t;

int print(char c) {
    printf("%c\n", c);
    return 1;
}

int main() {
    printer_t printer;
    printer.func_ptr = print; // 구조체의 함수 포인터 변수에 함수 주소 할당
    int r = printer.func_ptr(100); // 구조체의 함수 포인터를 사용하여 함수 호출
    return 0;
}



 

오늘은 위와 같은 C언어에서 함수 포인터 사용방법에 대해 알아보았습니다.
구조체 변수와 같이 관리하기 쉬운 타입에 동적으로 내가 호출할 함수를 변경할 수 있다는 것이 장점이었습니다.
또한 이런 구조로 인해 프로그램이 조금더 유연해진다는 것을 확인할 수 있었습니다.

반응형


살구엉덩이님의
글이 좋았다면 응원을 보내주세요!