본문 바로가기

C언어

Chapter 16. 함수 포인터

Chapter 16.함수 포인터

함수를 가리킬 수 있는 포인터!!

많이 사용되지는 않지만 수치해석과 같은 분야에서 함수 포인터가 없다면 상당히 프로그램이 복잡해짐을 느낄 수 있을 것이다.

트리를 순회하는데 재귀함수 기능이 없다면 구현에 훨씬 많은 시간과 노력이 필요할 것이다.

함수 포인터의 개념과 기본적인 활용에 대해 간단히 짚고 넘어가자.

함수 포인터의정의

type (*name)(arg list);

"name"은 함수를 가리킬 수 있는 포인터 변수이다. 그러므로name에 대한4byte가 할당된다.

"type"은name이 가리키는 함수가 리턴하는 형(type)을 말하고,"arg list"는 name이 가리키는 함수의 매개변수 리스트이다.

int (*imsi)(int, char *);

imsi가 가리키는 함수는 int형을 인자로"int"와 "char *"를 가진다.

함수 포인터의 초기화

만들어 놓은 함수 포인터변수에 함수가 저장된 곳의 번지를 할당하는 것이다.

int add(int, int);

int(*imsip)(int, int);

imsip = imsi;

"imsip= &imsi"가 아니라 "imsip = imsi"임을 주목하자. 함수명은 수식 내에서 함수를 가리키는 주소로 자동 변환되기 때문에 이와 같은 수식이 가능하다.

함수 포인터 호출

imsi = imsip(5, 4);

포인터 개념에 따르면"imsi = (*imsip)(5,4)처럼 호출을 하지만

ANCI-C는 '*'연산자를 생략할 수 있도록 규정하여 주로 생략한다.

만약, 함수 포인터라는 것을 명확히 하고 싶다면'*' 연산자를 사용하는 것도괜찮다.

결국, 아래와 같은호출 식은 모두동일한 값을 리턴한다.

imsi = add(5, 4);

imsi =imsip(5, 4);

imsi = (*imsip)(5, 4);

경우에따라서다른 함수를 호출하는 예제를 살펴보자.

16_1.c

#include <stdio.h>

main()
{
int add(int, int);
int mul(int, int);

int (*imsip)(int, int);
char operation;
int one, two;

printf("input (oper num num) : ");
scanf("%c %d %d", &operation, &one, &two);

if(operation == '+')
imsip = add;
else
imsip = mul;

printf("result : %d\n", imsip(one, two));
}

int add(int one, int two)
{
return one+two;
}

int mul(int one, int two)
{
return one*two;
}

gcc -o16_1 16_1.c

./16_1
input (oper num num) : * 5 4
result : 20

간단한 프로그램이지만 함수 포인터를 사용함으로써 "함수 호출"이 간결해지고 printf()문을 한번만 사용하여 출력할 수 있데 된다.

16_2.c

#include <stdio.h>

main()
{
int add(int);
int mul(int);

int (*func[2])(int);
int i;

func[0] = add;
func[1] = mul;

for(i=0;i<100;i++)
if((i % 2) == 0)
printf("func[0] : %d\n", func[0](i));
else
printf("func[1] : %d\n", func[1](i));
}

int add(int imsi)
{
return imsi + imsi;
}

int mul(int imsi)
{
return imsi * imsi;
}

gcc -o 16_2 16_2.c

./16_2

func[0] : 0
func[1] : 1
func[0] : 4
func[1] : 9
func[0] : 8
func[1] : 25
func[0] : 12
func[1] : 49
func[0] : 16
func[1] : 81
func[0] : 20

...

함수를 가리키는 포인터를 두 개 생성하고 각각이함수를 가리키도록 하였다.

i의 값에 따라서 함수 포인터를 다르게 호출하도록하는 프로그램이다.

'C언어' 카테고리의 다른 글

Chapter 19. 라이브러리  (0) 2011.10.16
Chapter 15. 함수 인자 포인터  (0) 2011.10.16
Chapter 17. 구조체와 포인터  (0) 2011.10.16
Chapter 13. (int *)pointer  (0) 2011.10.16
Chapter 14. void형 포인터  (0) 2011.10.16