① 함수 포인터의 정의
함수를 가리키는 포인터를 정의하는 것은 여타의 포인터 변수 정의처럼 상당히 쉬운 작업이다.
type (*name)(arg list); |
name은 함수를 가리킬 수 있는 포인터 변수이다. (그러므로 name에 대한 4바이트가 할당된다.)
"type"은 name이 가리키는 함수가 리턴하는 형(type)을 말하고 "arg list"는 name이 가리키는 함수의 매개변수 리스트이다.
int (*imsi)(int, char *); |
imsi가 가리키는 함수는 int형을 리턴하고 인자로 "int"와 "char *"를 가진다.
② 함수 포인터 호출
함수 포인터를 초기화 한다는 것은 만들어 놓은 함수 포인터 변수에 함수를 대입하는 과정이다. 함수를 대입한다기 보다는 함수가 저장된 곳의 번지를 할당하는 것이다.
int add(int, int); int (*imsip)(int, int); imsip = add; |
add()라는 함수는 두 개의 인자를 받아들여 이를 더하고 결과 값을 리턴한다고 가정하자. imsip는 함수를 가리킬 수 있으므로 imsip에 add()라는 함수를 할당한다. 그런데 "imsip = &add"가 아니라 "imsip = add"를 사용하였다. 함수명은 수식 내에서 함수를 가리키는 주소로 자동변환되기 때문에 이와 같은 수식이 가능하다.
③ 함수 포인터 호출
ANSI-C는 '*' 연산자를 생략할 수 있도록 규정했으므로 생략된 형식을 주로 많이 사용한다. 만약 함수 포인터라는 것을 명확히 하고 싶다면 두번째 수식을 사용하는 것도 괜찮다.
imsi = add(5, 4); imsi = imsip(5, 4); imsi = (*imsip) (5, 4); |
④ 함수 포인터 사용 예제
#include<stdio.h> #include<string.h> main() { int add(int, int); int mul(int, int); int (*imsip)(int, int); int operation, 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; } |
imsip는 add()라는 함수나 mul()이라는 함수를 상황에 따라 모두 가리킬 수 있다. 사용자가 '+' 연산자 후 두 개의 숫자를 입력하면 imsip에 add() 함수의 주소가 할당되고 '*' 연산자 후 두 개의 숫자를 입력하면 imsip에는 mul()함수의 주소가 할당될 것이다. '+' 일때는 add()함수로 분기해도 되는 프로그램이므로 효용성이 반감될 수 있지만 함수 포인터에 여러 함수를 대입할 수 있다는 개념을 익히기에는 충분하다. 위의 프로그램에서 장점이라고 한다면 함수 호출이 간견하다는 것과 printf()문을 딱 한번만 사용해도 된다는 것이다.
지금까지 보인 것은 1차원 함수 포인터 였는데 2차원 함수 포인터도 얼마든지 가능하다
#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; } [출력결과] 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 : : |
출처: 다시 체계적으로 배우는 C언어 포인터(정보문화사:정재은 저)