함수 포인터

-> 함수의 주소를 저장하는 변수

-> 함수 포인터는 코드 영역에 들어간다.

-> 할당 시점 : 프로그램 시작시 

-> 할당 종료 : 프로그램 종료시

 

 

함수를 호출할 때 함수명 + ()를 이용한다.

-> 연산자 ()를 제거하면 함수명만 남게된다.

-> 함수명은 함수의 주소를 가지고 있다.

-> cout을 통해 함수명만 호출하면 함수의 주소가 나오게된다.

 

함수 포인터의 형태

int Add(int _a, int _b)
{
	return _a + _b;
}	

반환타입(* 변수명) (인자타입, 인자타입, 인자타입... )
int(*ptr)(int, int) = Add;
    
cout << ptr(10, 20) << endl;

 

일반 함수 switch 사용

int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;
	cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
	cout << "============================================" << endl;
	cout << "입력: ";
	cin >> iSelect;

	switch (iSelect)
	{
	case 1:
		iRes = Add(iA, iB);
		break;
	case 2:
		iRes = Min(iA, iB);
		break;
	case 3:
		iRes = Mul(iA, iB);
		break;
	case 4:
		iRes = Div(iA, iB);
		break;
	default:
		break;
	}

	cout << "연산 결과: " << iRes << endl;

 

함수 포인터 switch 사용

	int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;
	cout << "1.더하기 2.빼기 3.곱하기 4.나누기" << endl;
	cout << "============================================" << endl;
	cout << "입력: ";
	cin >> iSelect;

	int(*ptr)(int, int) = nullptr;

	switch (iSelect)
	{
	case 1:
		ptr = Add;
		break;
	case 2:
		ptr = Min;
		break;
	case 3:
		ptr = Mul;
		break;
	case 4:
		ptr = Div;
		break;
	default:
		break;
	}
	cout << "연산 결과: " << ptr(iA, iB) << endl;

switch를 통해 함수 포인터를 사용하였는데 코드가 너무 길다고 판단이 된다.

이를 해결하기 위해서 함수 포인터의 배열을 사용해보자.

 

함수 포인터 배열 사용

int Add(int _a, int _b)
{
	return _a + _b;
}
int Min(int _a, int _b)
{
	return _a - _b;
}
int Mul(int _a, int _b)
{
	return _a * _b;
}
int Div(int _a, int _b)
{
	return _a / _b;
}

int iA = 0, iB = 0, iSelect = 0, iRes = 0;
	cin >> iA >> iB;

int(*ptr[4])(int, int) = { Add, Min, Mul, Div };

cout << "연산 결과: " << ptr[iSelect - 1](iA, iB) << endl;

switch문을 사용했을 때와 결과는 같고 훨씬 더 코드가 간결해진 것을 볼 수 있다.

'Programming > C++ Basic' 카테고리의 다른 글

C++ 조건부 컴파일(#if, #ifdef, #ifndef 등)  (0) 2020.09.07
C++ 매크로(#define)  (0) 2020.09.07
C++ 공용체(union)  (0) 2020.09.07
C++ 열거체(enum)  (0) 2020.09.06
C++ 경로  (0) 2020.09.02

+ Recent posts