C언어 함수 포인터의 활용

  • 6 minutes to read

C 언어에서 함수 포인터는 함수의 주소를 가리키는 포인터로, 함수의 매개변수로 전달하거나 반환하는 등 다양한 용도로 사용됩니다. 이번 예제에서는 함수 포인터를 사용하여 두 수를 더하거나 빼는 기능을 수행하는 함수를 만들어보겠습니다.

덧셈과 뺄셈 함수 정의

다음은 함수 포인터에서 사용할 덧셈과 뺄셈 함수를 정의한 코드입니다.

void add(int a, int b)
{
    printf("%d + %d = %d\n", a, b, a + b);
}

void sub(int a, int b)
{
    printf("%d - %d = %d\n", a, b, a - b);
}

add 함수는 두 개의 정수를 입력받아 덧셈 연산을 수행하고, sub 함수는 두 개의 정수를 입력받아 뺄셈 연산을 수행합니다.

함수 포인터를 매개변수로 받는 calc 함수 정의

다음은 함수 포인터를 매개변수로 받아서 해당 함수를 실행하는 calc 함수를 정의한 코드입니다.

void calc(void (*func_ptr)(int a, int b), int a, int b)
{
    func_ptr(a, b);
}

calc 함수는 함수 포인터 func_ptr과 두 개의 정수 값을 매개변수로 받아 해당 함수 포인터가 가리키는 함수를 호출하는 역할을 합니다.

함수 포인터와 배열을 이용한 덧셈과 뺄셈 함수 실행

다음은 함수 포인터와 배열을 이용하여 덧셈과 뺄셈 함수를 실행하는 코드입니다.

int main(void)
{
    void (*operation_ptr)(int a, int b);

    void (*operations[2])(int a, int b);

    int a = 3;
    int b = 5;

    operation_ptr = add;

    operations[0] = add;
    operations[1] = sub;

    operation_ptr(3, 5);

    operations[0](a, b);
    operations[1](a, b);

    calc(add, 5, 5);

    return 0;
}

위 코드에서는 operation_ptr 함수 포인터를 이용하여 add 함수를 가리키고, operations 배열을 이용하여 add와 sub 함수를 가리키도록 설정합니다. 그 다음, 함수 포인터 operation_ptr을 이용하여 add 함수를 실행하고, 함수 포인터 배열 operations를 이용하여 add 함수와 sub 함수를 각각 실행합니다. 마지막으로 calc 함수를 호출하여 함수 포인터 add와 두 개의 정수 값을 매개변수로 전달하여 덧셈을 수행합니다.

전체 코드와 실행 결과

코드: function_pointer_calc.c

#include <stdio.h>

// 정수형 변수 a와 b를 더한 값을 출력하는 함수
void add(int a, int b)
{
	printf("%d + %d = %d\n", a, b, a + b);
}

// 정수형 변수 a와 b를 뺀 값을 출력하는 함수
void sub(int a, int b)
{
	printf("%d - %d = %d\n", a, b, a - b);
}

// 함수포인터 func_ptr과 정수형 변수 a, b를 매개변수로 받아 
// 함수포인터 func_ptr이 가리키는 함수에 a, b를 전달하여 실행하는 함수
void calc(void (*func_ptr)(int a, int b), int a, int b)
{
	func_ptr(a, b);
}

int main(void)
{
	// 함수포인터 operation_ptr을 정의
	void (*operation_ptr)(int a, int b);

	// 함수포인터 배열 operations를 정의
	void (*operations[2])(int a, int b);

	int a = 3;
	int b = 5;

	// 함수포인터 operation_ptr이 add 함수를 가리키도록 함
	operation_ptr = add;

	// 함수포인터 배열 operations의 첫 번째 원소에 add 함수를, 
	// 두 번째 원소에 sub 함수를 각각 가리키도록 함
	operations[0] = add;
	operations[1] = sub;

	// operation_ptr이 가리키는 함수(add 함수)를 실행함
	operation_ptr(3, 5); // 대리자

	// 함수포인터 배열 operations의 첫 번째 원소(add 함수)와 두 번째 원소(sub 함수)를 각각 실행함
	operations[0](a, b);
	operations[1](a, b);

	// 함수포인터 매개변수로 add 함수와 5, 5를 전달하여 실행함
	calc(add, 5, 5);

	return 0;
}

함수를 실행한 결과는 다음과 같습니다.

3 + 5 = 8
3 + 5 = 8
3 - 5 = -2
5 + 5 = 10

결과 부분에서는 함수 포인터를 활용하여 덧셈과 뺄셈 함수를 실행한 결과가 출력됩니다.

  • operation_ptr(3, 5) : operation_ptr 함수 포인터를 이용하여 add 함수를 실행한 결과 3 + 5 = 8이 출력됩니다.
  • operations[0](a, b) : operations 배열을 이용하여 add 함수를 실행한 결과 3 + 5 = 8이 출력됩니다.
  • operations[1](a, b) : operations 배열을 이용하여 sub 함수를 실행한 결과 3 - 5 = -2가 출력됩니다.
  • calc(add, 5, 5) : calc 함수를 이용하여 add 함수와 두 개의 정수 값을 매개변수로 전달하여 덧셈을 수행한 결과 5 + 5 = 10이 출력됩니다.

이렇게 함수 포인터를 활용하면 함수의 주소를 변수에 저장하여, 해당 변수를 통해 함수를 호출할 수 있습니다. 이를 활용하면 코드의 재사용성과 유연성이 높아지며, 코드의 가독성도 높아집니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com