본문 바로가기
프로그래밍언어/C 언어

[혼자 공부하는 C언어] 함수 포인터의 개념

by khsnote22 2022. 12. 15.

http://www.yes24.com/Product/Goods/74269921

 

혼자 공부하는 C 언어 - YES24

혼자 해도 충분하다! 1:1 과외하듯 배우는 C 프로그래밍 자습서이 책은 독학으로 C 언어를 배우는 입문자가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. ‘무엇을’ ‘어떻게’ 학

www.yes24.com


함수 포인터를 사용하기 위해 가장 중요한 것은 함수명의 의미를 파악하는 것입니다. 함수명은 함수 정의가 있는 메모리의 시작 위치입니다. 함수명이 주소이므로 포인터에 저장하면 함수를 다양한 방식으로 호출할 수 있습니다.

#include <stdio.h>

int sum(int, int); // 함수 선언

int main(void)
{
    int(*fp)(int, int); // 함수 포인터 선언
    int res; // 반환값을 저장할 변수
    
    fp = sum; // 함수명을 함수 포인터에 저장
    res = fp(10, 20); // 함수 포인터로 함수 호출
    printf("result : %d\n", res) // 반환값 출력
    
    return 0;
}

int sum(int a, int b) // 함수 정의
{
    return (a + b);
}

프로그램을 컴파일하면 함수도 실행 파일의 한 부분을 차지하므로 프로그램을 실행하면 함수도 메모리에 올려집니다. 메모리에 올려진 함수를 실행시키기 위해서는 그 위치를 알아야 하는데 컴파일 후에 함수명이 함수가 올려진 메모리 주소로 바뀌므로 함수를 호출할 때 함수명을 사용합니다.

 

함수명이 주소라는 증거는 간접 참조 연산자를 사용하면 알 수 있습니다. 주소에 간접 참조 연산자를 사용하면 가리키는 대상을 사용할 수 있듯이, 함수명에도 간접 참조 연산자를 사용하면 가리키는 함수의 기능을 사용할 수 있습니다.

 

함수의 주소도 포인터에 저장하면 포인터로 함수를 호출할 수 있습니다. 주소를 저장할 포인터는 주소가 가리키는 것과 동일한 형태를 가리키도록 선언합니다. 따라서 sum 함수의 형태를 파악하는 것이 우선입니다.


함수의 형태

함수 형태는 매개변수의 개수와 자료형, 그리고 반환값의 자료형으로 정의합니다.  함수 선언에서 알 수 있으며, 이것이 함수 포인터가 가리키는 형태입니다. 

int sum(int, int);

이제 함수의 주소 sum을 저장할 함수 포인터를 선언해보겠습니다. 함수 포인터는 변수명 앞에 별(*)을 붙여 포인터임을 표시합니다. 그리고 가리키는 함수의 형태를 반환값과 매개변수로 나누어 적습니다.

int (*fp)(int, int);

이때 반드시 변수명을 별표와 함께 괄호로 묶어야 합니다. 괄호가 없으면 주소를 반환하는 함수의 선언이 되므로 주의해야 합니다.

int *fp(int, int);

함수 포인터를 선언한 후에 함수명을 저장하면 포인터를 함수처럼 쓸 수 있습니다. 이때 함수 포인터도 간접 참조 연산자 없이 함수 호출이 가능합니다.

res = fp(10, 20);