본문으로 바로가기

   

 

함수 포인터
함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다.(함수 포인터)
함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장 할 수 있다.
함수 포인터 변수를 선언하려면 함수 포인터 형을 알아야 한다.

함수 포인터의 형(type)
함수 포인터의 형 정보에는 반환형과 매개변수 선언에 대한 정보를 담기로 약속
즉, 함수의 반환형과 매개변수 선언이 동일한 두 함수의 포인터 형은 일치한다.

함수 포인터형 결정
int SimpleFunc(int num) // 반환형 int, 매개변수 int형 1개
double ComplexFunc(double num1, double num2) // 반환형 double, 매개변수 double형 2개

int SoSimple(int num1, int num2) { .... }
int (*fptr) (int, int); // SoSimple 함수 이름과 동일한 형의 변수 선언
fptr = SoSimple; //상수의 값을 변수에 저장
fptr(3, 4); //SoSimple(3, 4)와 동일한 결과를 보임.

//예제1
#include <stdio.h>

void SimpleAdder(int n1, int n2)
{
	printf("%d + %d = %d\n", n1, n2, (n1 + n2));
}

void ShowString(char * str)
{
	printf("%s\n", str);
}

void main()
{
	char * str = "Function Pointer";
	int num1 = 10, num2 = 20;

	void(*fptr1)(int, int) = SimpleAdder;
	void(*fptr2)(char*) = ShowString;

	//함수 포인터 변수에 의한 호출
	fptr1(num1, num2);
	fptr2(str);

}

 

//예제2
#include <stdio.h>

int WhoIsFirst(int age1, int age2, int(*cmp)(int n1, int n2)) {
	return cmp(age1, age2);
}

int OlderFirst(int age1, int age2) {
	if (age1 > age2)
		return age1;
	else if (age1 < age2)
		return age2;
	else return 0;
}

int YoungerFirst(int age1, int age2) {
	if (age1 < age2)
		return age1;
	else if (age1 > age2)
		return age2;
	else return 0 ;
}
void main()
{
	int age1 = 20;
	int age2 = 30;
	int first;

	printf("입장순서1\n");
	first = WhoIsFirst(age1, age2, OlderFirst);
	printf("%d와 %d중 %d가 먼저 입장\n", age1, age2, first);

	printf("입장순서2\n");
	first = WhoIsFirst(age1, age2, YoungerFirst);
	printf("%d와 %d중 %d가 먼저 입장\n", age1, age2, first);
}

형(Type)이 존재하지 않는 void 포인터
void * ptr; // void형 포인터 변수
void형 포인터 변수에는 어떠한 변수의 주소 값이든 담을 수 있다. 하지만, void형 포인터 변수를 가지고는 아무런 포인터 연산도 하지 못한다. 값의 변경이나 참조도 불가능하다.