-
[C/C++ 강좌] 94강. 함수 포인터C++ 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형인 새로운 함수만 정의하면 된다. 여기서 한 가지 한계점은 자료형이 반드시 일치해야 한다는 점이지만 탬플릿을 사용한다면 이러한 문제점도 해결할 수 있다.
'C++' 카테고리의 다른 글
[C/C++ 강좌] 93강. 예외 처리 (0) 2022.01.22 [C/C++ 강좌] 92강. 템플릿 (2) - 템플릿 특수화와 비타입 파라미터 (0) 2022.01.22 [C/C++ 강좌] 91강. 템플릿 (1) - 함수 템플릿과 클래스 템플릿 (0) 2022.01.22 [C/C++ 강좌] 90강. 정사각형-직사각형 문제 (0) 2022.01.21 [C/C++ 강좌] 89강. 다중 상속과 다이아몬드 문제 (0) 2022.01.21