rueki
함수 포인터 본문
728x90
반응형
이번 시간에는 함수포인터에 대해서 알아보는 시간이다.
포인터의 개념이 처음 듣게 될 때는 아마 변수의 포인터 선언에 대한 내용에서 나왔을 것이다.
여기서는 변수 대신에 함수라고 생각을 하면 될 것 같다.
#include <iostream>
using namespace std;
int func()
{
return 5;
}
int main()
{
cout << func << endl;
return 0;
}
위의 예제는 5를 반환받는 func()라는 함수를 생성했다.
메인에서 생성하면 5가 나올까? 답은 '아니다' 이다. 메인 부분을 실행하면 func()에대한 주소값이 출력이 된다.
#include <iostream>
using namespace std;
int func()
{
return 5;
}
int goo()
{
return 10;
}
// 함수도 주소만 가지고 무언가를 할 수가 있다.
// 함수포인터 선언
int main()
{
// func의 주소값을 받아와서 *fcnptr로 전달
int(*fcnptr)() = func;
cout << fcnptr() << endl; // 5
fcnptr = goo; // goo 함수의 주소를 넣음
cout << fcnptr() << endl; // 10
return 0;
}
위의 코드에서 메인부분에 포인터 변수를 선언했다. 대입값은 함수의 주소값을 넣었다.
그 변수를 실행하면, 대입한 함수의 실행 값이 출력되게 되고,
그 변수에 새로운 함수의 주소를 넣고 실행하면 마지막에 넣은 함수의 값이 나오는 것을 알 수가 있었다.
void printNumbers(const array<int, 10>& my_arr, bool print_even)
{
for (auto element : my_arr)
{
if (print_even && element % 2 == 0) { cout << element; }
if (!print_even && element % 2 == 1) cout << element;
}
cout << endl;
}
int main()
{
array<int, 10> my_arr = { 0,1,2,3,4,5,6,7,8,9 };
printNumbers(my_arr,true);
return 0;
}
여기서는 이제 홀수와 짝수를 출력하는 예제인데, 출력함수에 boolean형을 사용해서 코드를 구현해보았다. 그러나
밑의 코드처럼 boolean함수를 선언하고 넣으면 더 간결한 것도 있지만, printNumbers의 boolean형 변수 파라메터에 무엇이 들어갔는지 보자. 함수포인터를 넣은 것을 볼 수가 있다. 그리고 그 안에 이제 함수의 주소를 전달하게 된다면,
그 대입한 함수의 기능이 실행이 되는 것을 알 수가 있다.
bool isEven(const int& number)
{
if (number % 2 == 0) return true;
}
bool isOdd(const int& number)
{
if (number % 2 != 0) return true;
}
void printNumbers(const array<int, 10>& my_arr, bool (*check_fcn)(const int&))
{
for (auto element : my_arr)
{
if (check_fcn(element)) { cout << element; }
}
cout << endl;
}
int main()
{
array<int, 10> my_arr = { 0,1,2,3,4,5,6,7,8,9 };
printNumbers(my_arr, isEven);
return 0;
}
728x90
반응형
'C,C++ 기초 및 자료구조' 카테고리의 다른 글
생성자와 소멸자 (0) | 2020.10.06 |
---|---|
C++ 입출력 (0) | 2020.09.16 |
매개변수의 기본값 (0) | 2020.07.21 |
함수 오버로딩(Function Overloading) (0) | 2020.07.18 |
다양한 타입의 return (0) | 2020.07.15 |
Comments