C++

[C/C++ 강좌] 94강. 함수 포인터

코다람쥐 2022. 1. 22. 15:17

https://www.youtube.com/watch?v=1S4gGCx0syc&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=99

 

1. 함수 포인터

함수이 주소값을 저장하는 포인터를 의미한다.

#include <iostream>
using namespace std;

bool compare(int a, int b) {
	return a == b;
}

int main() {
	bool (*fp)(int, int);
	fp = &compare;
	bool res = (*fp)(2, 3);
}

위와 같은 형식으로 선언하며 사용한다.

	fp = compare;
	bool res = fp(2, 3);

그리고 엠퍼센드(&)와 에스트로크(*)를 생략이 가능하다.

 

2. 함수 포인터 활용해보기

#include <iostream>
using namespace std;

int arrMin(const int arr[], int n) {
	int min = arr[0];
	for (int i = 1; i < n; i++) {
		if (arr[i] < min) {
			min = arr[i];
		}
	}
	return min;
}

int arrSquareMin(const int arr[], int n) {
	int min = arr[0] * arr[0];
	for (int i = 1; i < n; i++) {
		if (arr[i] * arr[i] < min) {
			min = arr[i] * arr[i];
		}
	}
	return min;
}

int main() {
	int arr[7] = { 3, 1, -4, 1, 5, 9, -2 };
	cout << arrMin(arr, 7) << endl;
	cout << arrSquareMin(arr, 7) << endl;
}

위 arrMin과 arrSquareMin함수는 각각 배열 요소들의 최소값과 배열 요소들의 제곱의 최소값을 구하는 함수이다.

이렇게 모든 Min의 경우에 대해서 일일이 정의한다면 이건 개발자에게 분명 스트레스다.

 

#include <iostream>
using namespace std;

int square(int x) { return x * x; }
int arrFnMin(const int arr[], int n, int (*f)(int)) {
	int min = f(arr[0]);
	for (int i = 1; i < n; i++) {
		if (f(arr[i]) < min) {
			min = f(arr[i]);
		}
	}
	return min;
}

int main() {
	int arr[7] = { 3, 1, -4, 1, 5, 9, -2 };
	cout << arrFnMin(arr, 7, square) << endl;
}

제곱을 해주는 함수를 따로 정의하고 arrFnMin함수의 매개변수로 square함수를 받는다.

만약 제곱이 아니고 여러가지 식에 대한 함수를 정의하고 여러가지 식에 대한 최소값을 구하고 싶다면 매개변수형이 int형인 새로운 함수만 정의하면 된다. 여기서 한 가지 한계점은 자료형이 반드시 일치해야 한다는 점이지만 탬플릿을 사용한다면 이러한 문제점도 해결할 수 있다.