프로그래머가 정의한 함수들은 모두 프로그램 실행시 메인메모리에 저장되어 실행된다. 함수의 이름은 메모리 상에 저장된 함수의 주소값을 의미한다. 함수의 주소값 또한 양의 정수이므로 포인터 변수에 저장할 수 있다. 이러한 포인터 변수를 함수 포인터 변수라 한다.
함수 포인터의 형은 리턴타입과 매개변수의 정보를 가진다.
함수 포인터는 다음과 같이 선언한다.
int Func(int num){ //리턴타입이 int, 매개변수가 int인 함수
...
}
int (*ptr) (int); //리턴타입이 int, 매개변수가 int인 함수 포인터
ptr = Func;
ptr(10);
int Func(int num1, int num2){
...
}
int (*ptr) (int, int);
ptr = Func;
ptr(3, 5);
함수의 매개변수로 함수 포인터 변수가 전달될 수 있다. 다음의 예제를 참고하면 쉽게 이해할 수 있다.
#include <stdio.h>
int BiggerOrSmaller(int num1, int num2, int (*cmp)(int, int));
int Bigger(int num1, int num2);
int Smaller(int num1, int num2);
int main(void) {
int num1, num2;
printf("두 정수를 입력하시오 : ");
scanf("%d %d", &num1, &num2);
printf("%d와 %d 중 큰 수는 %d\n", num1, num2, BiggerOrSmaller(num1, num2, Bigger));
printf("%d와 %d 중 작은 수는 %d", num1, num2, BiggerOrSmaller(num1, num2, Smaller));
return 0;
}
int BiggerOrSmaller(int num1, int num2, int (*cmp)(int, int)) {
return cmp(num1, num2);
}
int Bigger(int num1, int num2) {
int bigger = (num1 > num2) ? num1 : num2;
return bigger;
}
int Smaller(int num1, int num2) {
int smaller = (num1 < num2) ? num1 : num2;
return smaller;
}
두 정수를 입력하시오 : 50 10
50와 10 중 큰 수는 50
50와 10 중 작은 수는 10
void 포인터는 형이 존재하지 않는 포인터 변수이다. 다음과 같이 선언한다.
void *ptr;
이렇게 선언한 void 포인터 변수에는 어떠한 변수의 주소값이나 함수의 주소값을 저장할 수 있다.
하지만 형을 명시하지 않았기 때문에 void 포인터를 이용한 포인터 연산이나 값의 변경, 참조가 불가하다.
메모리 동적 할당과 관계를 가진다.
지금까지 main함수는 int main(void)
와 같이 선언했다.
하지만 다음과 같이 선언할 수 있다.
int main(int argc, char *argv[])
이러한 매개변수를 가진 main함수는 어떻게 동작하는지 다음 예시를 보자.