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형인 새로운 함수만 정의하면 된다. 여기서 한 가지 한계점은 자료형이 반드시 일치해야 한다는 점이지만 탬플릿을 사용한다면 이러한 문제점도 해결할 수 있다.