Chapter 16.함수 포인터
함수를 가리킬 수 있는 포인터!!
많이 사용되지는 않지만 수치해석과 같은 분야에서 함수 포인터가 없다면 상당히 프로그램이 복잡해짐을 느낄 수 있을 것이다.
트리를 순회하는데 재귀함수 기능이 없다면 구현에 훨씬 많은 시간과 노력이 필요할 것이다.
함수 포인터의 개념과 기본적인 활용에 대해 간단히 짚고 넘어가자.
함수 포인터의정의
type (*name)(arg list);
"name"은 함수를 가리킬 수 있는 포인터 변수이다. 그러므로name에 대한4byte가 할당된다.
"type"은name이 가리키는 함수가 리턴하는 형(type)을 말하고,"arg list"는 name이 가리키는 함수의 매개변수 리스트이다.
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 |